开发者

I can not call jquery plugin function outside of plugin code

This is my definition

$(".HideOnClick").live({ click: function () { deactive_tiptip() } });

This is how i am calling it inside title of html elements

<a href=# class=HideOnClick>Close Me</a> 

This is how i add the TipTip plugin to my content

<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="Server">
    <script type="text/javascript" src="http://static.monstermmorpg.com/js_files/jquery_1_6_2_min.js"></script>
    <script type="text/javascript" src="http://static.monstermmorpg.com/js_files/jquery_tipTip_minified.js"></script>
</asp:Content>

But it gives function undefined error. Plugin is working perfectly.

This is the plugin source code

 /*
 * TipTip
 * Copyright 2010 Drew Wilson
 * www.drewwilson.com
 * code.drewwilson.com/entry/tiptip-jquery-plugin
 *
 * Version 1.3   -   Updated: Mar. 23, 2010
 *
 * This Plug-In will create a custom tooltip to replace the default
 * browser tooltip. It is extremely lightweight and very smart in
 * that it detects the edges of the browser window and will make sure
 * the tooltip stays within the current window size. As a result the
 * tooltip will adjust itself to be displayed above, below, to the left 
 * or to the right depending on what is necessary to stay within the
 * browser window. It is completely customizable as well via CSS.
 *
 * This TipTip jQuery plug-in is dual licensed under the MIT and GPL licenses:
 *   http://www.opensource.org/licenses/mit-license.php
 *   http://www.gnu.org/licenses/gpl.html
 */

(function($){
    $.fn.tipTip = function(options) {
        var defaults = { 
            activation: "hover",
            keepAlive: false,
            sticky: false,
            maxWidth: "200px",
            edgeOffset: 3,
            defaultPosition: "bottom",
            delay: 400,
            fadeIn: 200,
            fadeOut: 200,
            attribute: "title",
            content: false, // HTML or String to fill TipTIp with
            enter: function(){},
            exit: function(){}
        };
        var opts = $.extend(defaults, options);

        // Setup tip tip elements and render them to the DOM
        if($("#tiptip_holder").length <= 0){
            var tiptip_holder = $('<div id="tiptip_holder" style="max-width:'+ opts.maxWidth +';"></div>');
            var tiptip_content = $('<div id="tiptip_content"></div>');
            var tiptip_arrow = $('<div id="tiptip_arrow"></div>');
            $("body").append(tiptip_holder.html(tiptip_content).prepend(tiptip_arrow.html('<div id="tiptip_arrow_inner"></div>')));
        } else {
            var tiptip_holder = $("#tiptip_holder");
            var tiptip_content = $("#tiptip_content");
            var tiptip_arrow = $("#tiptip_arrow");
        }

        return this.each(function(){
            var org_elem = $(this);
            if(opts.content){
                var org_title = opts.content;
            } else {
                var org_title = org_elem.attr(opts.attribute);
            }
            if(org_title != ""){
                if(!opts.content){
                    org_elem.removeAttr(opts.attribute); //remove original Attribute
                }
                var timeout = false;

                if(opts.activation == "hover"){
                    org_elem.hover(function(){
                        active_tiptip();
                    }, function(){
                        if(!opts.keepAlive){
                            deactive_tiptip();
                        }
                    });
                    if(opts.keepAlive){
                        tiptip_holder.hover(function(){}, function(){

                        });
                    }
                } else if(opts.activation == "focus"){
                    org_elem.focus(function(){
                        active_tiptip();
                    }).blur(function(){
                        deactive_tiptip();
                    });
                } else if(opts.activation == "click"){
                    org_elem.click(function(){
                        active_tiptip();
                        return false;
                    }).hover(function(){},function(){
                        if(!opts.keepAlive){
                            deactive_tiptip();
                        }
                    });
                    if(opts.keepAlive){
                        tiptip_holder.hover(function(){}, function(){

                        });
                    }
                }

                function active_tiptip(){
                    opts.enter.call(this);
                    tiptip_content.html(org_title);
                    tiptip_holder.hide().removeAttr("class").css("margin","0");
                    tiptip_arrow.removeAttr("style");

                    var top = parseInt(org_elem.offset()['top']);
                    var left = parseInt(org_elem.offset()['left']);
                    var org_width = parseInt(org_elem.outerWidth());
                    var org_height = parseInt(org_elem.outerHeight());
                    var tip_w = tiptip_holder.outerWidth();
                    var tip_h = tiptip_holder.outerHeight();
                    var w_compare = Math.round((org_width - tip_w) / 2);
                    var h_compare = Math.round((org_height - tip_h) / 2);
                    var marg_left = Math.round(left + w_compare);
                    var marg_top = Math.round(top + org_height + opts.edgeOffset);
                    var t_class = "";
                    var arrow_top = "";
                    var arrow_left = Math.round(tip_w - 12) / 2;

                    if(opts.defaultPosition == "bottom"){
                        t_class = "_bottom";
                    } else if(opts.defaultPosition == "top"){ 
                        t_class = "_top";
                    } else if(opts.defaultPosition == "left"){
                        t_class = "_left";
                    } else if(opts.defaultPosition == "right"){
                        t_class = "_right";
                    }

                    var right_compare = (w_compare + left) < parseInt($(window).scrollLeft());
                    var left_compare = (tip_w + left) > parseInt($(window).width());

                    if((right_compare && w_compare < 0) || (t_class == "_right" && !left_compare) || (t_class == "_left" && left < (tip_w + opts.edgeOffset + 5))){
                        t_class = "_right";
                        arrow_top = Math.round(tip_h - 13) / 2;
                        arrow_left = -12;
                        marg_left = Math.round(left + org_width + opts.edgeOffset);
                        marg_top = Math.round(top + h_compare);
                    } else if((left_compare && w_compare < 0) || (t_class == "_left" && !right_compare)){
                        t_class = "_left";
                        arrow_top = Math.round(tip_h - 13) / 2;
                        arrow_left =  Math.round(tip_w);
                    开发者_JAVA技巧    marg_left = Math.round(left - (tip_w + opts.edgeOffset + 5));
                        marg_top = Math.round(top + h_compare);
                    }

                    var top_compare = (top + org_height + opts.edgeOffset + tip_h + 8) > parseInt($(window).height() + $(window).scrollTop());
                    var bottom_compare = ((top + org_height) - (opts.edgeOffset + tip_h + 8)) < 0;

                    if(top_compare || (t_class == "_bottom" && top_compare) || (t_class == "_top" && !bottom_compare)){
                        if(t_class == "_top" || t_class == "_bottom"){
                            t_class = "_top";
                        } else {
                            t_class = t_class+"_top";
                        }
                        arrow_top = tip_h;
                        marg_top = Math.round(top - (tip_h + 5 + opts.edgeOffset));
                    } else if(bottom_compare | (t_class == "_top" && bottom_compare) || (t_class == "_bottom" && !top_compare)){
                        if(t_class == "_top" || t_class == "_bottom"){
                            t_class = "_bottom";
                        } else {
                            t_class = t_class+"_bottom";
                        }
                        arrow_top = -12;                        
                        marg_top = Math.round(top + org_height + opts.edgeOffset);
                    }

                    if(t_class == "_right_top" || t_class == "_left_top"){
                        marg_top = marg_top + 5;
                    } else if(t_class == "_right_bottom" || t_class == "_left_bottom"){     
                        marg_top = marg_top - 5;
                    }
                    if(t_class == "_left_top" || t_class == "_left_bottom"){    
                        marg_left = marg_left + 5;
                    }
                    tiptip_arrow.css({"margin-left": arrow_left+"px", "margin-top": arrow_top+"px"});
                    tiptip_holder.css({"margin-left": marg_left+"px", "margin-top": marg_top+"px"}).attr("class","tip"+t_class);

                    if (timeout){ clearTimeout(timeout); }
                    timeout = setTimeout(function(){ tiptip_holder.stop(true,true).fadeIn(opts.fadeIn); }, opts.delay); 
                }

                function deactive_tiptip(){
                    opts.exit.call(this);
                    if (timeout){ clearTimeout(timeout); }
                    tiptip_holder.fadeOut(opts.fadeOut);
                }
            }               
        });
    }
})(jQuery);     

I am calling functions like this and they are working

   <script>
        $(function () {
            $(".KeepAlive").tipTip({ fadeIn: 25, fadeOut: 25, delay: "25", maxWidth: "300px", edgeOffset: 5, keepAlive: true, activation: "click", defaultPosition: "right", exit: function () { } });
            $(".ShowTitle").tipTip({ fadeIn: 25, fadeOut: 25, delay: "25", maxWidth: "300px", edgeOffset: 5, keepAlive: true, defaultPosition: "right" });
            $(".HideOnClick").live('click', function () {
                deactive_tiptip();
            });
        });

        function pageLoad() {

            if (Sys.WebForms.PageRequestManager.getInstance().get_isInAsyncPostBack()) {

                $(".KeepAlive").tipTip({ fadeIn: 25, fadeOut: 25, delay: "25", maxWidth: "300px", edgeOffset: 5, keepAlive: true, activation: "click", defaultPosition: "right" });
                $(".ShowTitle").tipTip({ fadeIn: 25, fadeOut: 25, delay: "25", maxWidth: "300px", edgeOffset: 5, keepAlive: true, defaultPosition: "right" });
                $('body').css('cursor', 'default');

            }
        }

 kT.Style.Value = srOtherPlayerImagesLeftValues[i] + " " + srOtherPlayerImagesTopValues[i] + " ";
                                lbUImg.Text = " <img  class=\"KeepAlive\"  src=\"" + 
                                    "http://static.monstermmorpg.com/images/userImages/trainer" + dsOtherUsers.Tables[0].Rows[i]["charImage"].ToString() +  
                                    dsOtherUsers.Tables[0].Rows[i]["Direction"].ToString() + ".png\"" +
                                   " title='İsim: "+ dsOtherUsers.Tables[0].Rows[i]["userName"].ToString() +
                                     "<hr/>" +
                                    "<a href=http://www.monstermmorpg.com/PVPBattleOffer.aspx?UserName=" + dsOtherUsers.Tables[0].Rows[i]["userName"].ToString() 
                                    +" target=_blank class=linkUserMap>PVP Savaşı Teklif Et</a><hr/>" +
                                "<a href=http://www.monstermmorpg.com/SeeUserProfile.aspx?PlayerName=" + dsOtherUsers.Tables[0].Rows[i]["userName"].ToString()
                                + " target=_blank class=linkUserMap>Profilini Göster</a><hr/> <a href=# class=HideOnClick>Close Me</a>  '\"/>";


The problem is that deactive_tiptip isn't an exposed function, not in the scope you're trying to use it in. Instead, you can * normally* trigger it with the same event on to "exit"....but since you're using keepAlive: true that won't work either.

You could instead (since it isn't exposed) just do what the plugin does internally, like this:

$(".HideOnClick").live({ 
  click: function () { $("#tiptip_holder").fadeOut(); }
});

Not however, this won't call your defined exit function, but since the only one you have is a no-op, this should be fine.

Also, if you want it a bit more efficient, go for delegate, something like this:

$(document).delegate(".HideOnClick", "click", function () {
  $("#tiptip_holder").fadeOut(); 
});

...this doesn't incur the initial $(".HideOnClick") selector cost for no reason.


I assume this error is happening when you actually call the $(".HideOnClick")... code.

It looks like your code doesn't yet know about the jQuery library. Things to try:

  1. Ensure your script is block is declared after the two library includes
  2. Ensure your script is placed in a $(document).ready() handler.


Isn't the correct syntax for live():

$(".HideOnClick").live('click', function() { deactive_tiptip(); });

Also you might want to look into delegate().

http://api.jquery.com/delegate/

It's better performance wise.

EDIT

The function you try to call isn't in the scope of where you call it (e.g. it is in the plugin).

You cannot access it directly from outside the plugin.

I also wouldn't be possible because the plugin does some stuff before the function is called in the plugin with data the function uses

EDIT 2

From the TipTip docs:

activation: string ("hover" by default) - jQuery method TipTip is activated with. Can be set to: "hover", "focus" or "click".

Don't think you can do exactly dwhat you want, consider the fact that the plugin has no deactivation settings. But perhaps you can extend the functionality to add a deactivation option.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜