【问题标题】:dialog is not a function error对话框不是函数错误
【发布时间】:2012-12-13 06:48:37
【问题描述】:

我有这个用于问题对话框的 JavaScript 代码:

// Question Dialog
function deletedialog(button, a){      
    $("<div />", {
        text: a
    }).dialog({        
        width: 600,
        buttons: {
            "Ok": function() { 
                $(button).closest("form").find("[id$=deleterow]").click();
                $(this).dialog("close");
                button.value = "Processing...";
                button.disabled = true;                  
            }, 
            "Cancel": function(event) { 
                $(this).dialog("close");
                event.preventDefault();
                button.value = "Delete";
                button.disabled = false;
            } 
        }
    });         
}

但由于某种原因,我在 Firebug 中找不到此错误:

TypeError: $(...).dialog is not a function  

这一行被高亮显示

“取消”:函数(事件){

当我在 JSF 头部添加这个以防止 JQuery 和 Primefaces 冲突时出现此问题:

<script type="text/javascript">
    $.noConflict();
</script>

我该如何解决这个问题?

【问题讨论】:

  • 由于您使用的是 noConflict,您是否尝试过使用 jQuery 而不是 $

标签: javascript jsf jsf-2 primefaces


【解决方案1】:

$.noConflict(); 之前,$ 等于jQuery

$.noConflict();之后,$等于undefined

这删除了jQuery$ 快捷方式,这就是它不再是一个函数的原因。当您添加另一个使用 $ 的 javascript 库时,通常只使用 $.noConflict();。您的选择是:

  1. 不要使用$.noConflict();
  2. 使用$.noConflict(); 并将每个$ 替换为jQuery
  3. 使用$.noConflict(); 并使用(function($){ ... })(jQuery) 包装您的代码

如果你需要使用$.noConflict();,我建议使用第三个。它通过将 jQuery 作为参数传递来将 $ 重新映射到 jQuery。使用您发布的代码,它可能看起来像...

(function($){

    // Question Dialog
    function deletedialog(button, a){      
        $("<div />", {
            text: a
        }).dialog({        
            width: 600,
            buttons: {
                "Ok": function() { 
                    $(button).closest("form").find("[id$=deleterow]").click();
                    $(this).dialog("close");
                    button.value = "Processing...";
                    button.disabled = true;                  
                }, 
                "Cancel": function(event) { 
                    $(this).dialog("close");
                    event.preventDefault();
                    button.value = "Delete";
                    button.disabled = false;
                } 
            }
        });         
    }

})(jQuery)

【讨论】:

  • Ryan,你的答案(几秒钟前发布)和我的答案(17 分钟前发布)有什么区别,除了“不要使用 $.noConflict(); i>”部分?
  • 不多。最大的不同是当我开始写我的时候你的答案没有发布。
【解决方案2】:

问题

问题是 $ 符号已通过使用 $.noConflict() 函数删除。请改用jQuery

两种解决方案

这基本上意味着您应该编写像jQuery(this).dialog("close"); 这样的函数调用,而不是$(this).dialog("close");

要为更大的代码段实现更改,您可以这样做:

(function($){
    // ... old code using "$" instead of "jQuery"
})(jQuery);

解决方案编号1 - 多个替换 - 示例

$(...) 调用替换为jQuery(...) 的解决方案可能如下所示:

// Question Dialog
function deletedialog(button, a){      
    jQuery("<div />", {
        text: a
    }).dialog({        
        width: 600,
        buttons: {
            "Ok": function() { 
                jQuery(button).closest("form").find("[id$=deleterow]").click();
                jQuery(this).dialog("close");
                button.value = "Processing...";
                button.disabled = true;                  
            }, 
            "Cancel": function(event) { 
                jQuery(this).dialog("close");
                event.preventDefault();
                button.value = "Delete";
                button.disabled = false;
            } 
        }
    });         
}

解决方案编号2 - 在匿名函数中包含代码 - 示例

这是基于您可以创建匿名函数并将jQuery 传递给它的事实,但将其分配给名为$ 的参数 - 这将导致函数中可用$ 符号,就好像它会发生一样在$.noConflict() 调用之前:

(function($){
    // Question Dialog
    function deletedialog(button, a){      
        $("<div />", {
            text: a
        }).dialog({        
            width: 600,
            buttons: {
                "Ok": function() { 
                    $(button).closest("form").find("[id$=deleterow]").click();
                    $(this).dialog("close");
                    button.value = "Processing...";
                    button.disabled = true;                  
                }, 
                "Cancel": function(event) { 
                    $(this).dialog("close");
                    event.preventDefault();
                    button.value = "Delete";
                    button.disabled = false;
                } 
            }
        });         
    }
})(jQuery);

【讨论】:

  • 请您更深入地解释您的想法好吗?
  • @PeterPenzov:您还可以将 noConflict 分配给变量并使用它来代替 $,例如:var j = jQuery.noConflict(); j.dialog(...)
  • @elclanrs:这可能是对的,但没有必要 - jQuery 变量仍然可以访问,对于其他开发人员来说,阅读 j = $.noConflict(); 或 @987654339 的代码可能过于复杂@ 而不是使用我给出的两种解决方案之一(所以只需使用jQuery 代替或将代码封闭在自称为匿名函数中,使$ 符号在匿名函数范围内再次可用)。
  • @PeterPenzov:完成。请看一下。我通常更喜欢使用jQuery 方法,因为它不会与其他框架(例如 MooTools)冲突,很清晰,并且 JS 缩小器仍然能够将其最小化。尽管对于较旧的代码以及其他一些情况,在匿名函数调用中包含代码的方法可能更简洁。我见过使用例如的例子。以下 sn-p:(function(window, $, undefined){ ... })(window, jQuery);.
  • 第二个例子是一个很好的说明,除了我认为在包含函数执行完成后不会定义函数“deleteddialog”。它要么需要在包含函数的内部调用,要么在某个 api 对象中返回。也许您可以添加注释(或函数调用),显示在这种情况下可以在何处使用 deleteddialog。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-11
  • 2015-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多