Jquery与Venobox冲突并从外部全局范围调用函数

时间:2014-12-10 21:27:49

标签: javascript jquery knockout.js lightbox

我尝试使用venobox加载一个div,在这个div中我将元素绑定到click函数,如小提琴所示

http://jsfiddle.net/mosta/gm9yf6vm/

如果您点击"删除"它会显示警报,但在加载venobox后它无法正常工作

  $(".btnconfirmdelete").click(function (event) {
              alert('');

          });    

Apreciate your help 感谢

1 个答案:

答案 0 :(得分:0)

jQuery,以及其他一些库,使用“ $ ”符号作为实际对象名称的别名 - 的jQuery ”。

由于多个库可能会尝试声明相同的美元别名,并且具有不同的API,因此代码期望美元符号与您的特定库混淆可能在页面之间不一致,具体取决于所使用的库 - 或者根本不使用冲突的库是全球使用的。

有很多方法可以解决这个问题 -

  1. 在代码中仅使用完整的jQuery对象名称。您提供的样本将变为 -

    jQuery(".btnconfirmdelete").click(function (event) {
       alert('');
    });
    

    您可以并且可能应该使用jQuery no conflict使用jQuery取消注册别名,以避免与其他库作斗争 -

    jQuery.noConflict();
    
  2. 您可以通过将jQuery noConflict函数的结果赋给变量,将jQuery分配给另一个别名

    var foo = jQuery.noConflict();
    
    foo(".btnconfirmdelete").click(function (event) {
       alert('');
    });
    
  3. 您可以将jQuery替换为立即调用函数表达式范围内的美元符号(请记住JavaScript中的变量具有函数而不是块作用域)。您再次想要使用noConflict来避免函数之外的问题。

    (function ($) {
        // Other code
    
        $(".btnconfirmdelete").click(function (event) {
            alert('');
        });
    
        // More code
    })(jQuery)
    
  4. jQuery有一个很好的帮助页面,可以在http://learn.jquery.com/using-jquery-core/avoid-conflicts-other-libraries/

    进行扩展

    要完成你的特定答案,你的代码中有一个错误 - 函数'callme'在两个函数范围之外被引用。

    我有forked your JSFiddle,修正后的代码如下。我也改进了你的格式,这是一个很好的做法,因为它可以帮助你直观地理解代码heirachy,以避免这样的问题 -

     (function ($, Sys) {
    
        $(document).ready(
            function () {
                $('.venobox').venobox();
    
                /* custom settings */
                $('.venobox_custom').venobox({
                    framewidth: '400px',        // default: ''
                    frameheight: '300px',       // default: ''
                    border: '10px',             // default: '0'
                    bgcolor: '#5dff5e',         // default: '#fff'
                    titleattr: 'data-title',    // default: 'title'
                    numeratio: true,            // default: false
                    infinigall: true            // default: false
                });
    
                $(".btnconfirmdelete").click(function (event) {
                    alert('Delete');   
                });
    
              function callme () { 
                  alert('Called');
              }
    
              callme();
        });
    }(jQuery, window.Sys));