【问题标题】:Jquery does not work with PrototypeJquery 不适用于原型
【发布时间】:2011-12-03 21:51:41
【问题描述】:
<script src="jquery.js"></script>
<script>
    var $jq = jQuery.noConflict();
    $jq(document).ready(function(){
        alert("123");
        $jq("#redactor_content").redactor();
        alert("456");
    });
</script>
<script src="prototype.js"></script>
<script src="redactor.js"></script>

“redactor.js”是基于 JQuery 的 WYSIWYG 编辑器:http://imperavi.com/download/redactor/get/,来源:

...
(function($){
   // Initialization
   $.fn.redactor = function(options)
   { ... };
})(jQuery);
...

当我评论“prototype.js”时 - 一切正常(我看到“123456”)。

使用“prototype.js” - 仅查看“123”和“redactor”不起作用。 (这意味着命名空间工作正常,对吧?为什么第二个警报不起作用?)

当我只评论 $jq(document).ready(function(){ 并在调用之前移动“redactor.js”(调用“redactor()”而不等待 DOM) - 一切都很好。

我不明白原理。包含“jquery.js”后,我首先覆盖“$”,然后包含“prototype.js”以避免冲突。但是 Namespace Jquery 不知何故仍然与 Prototype 相交。我怀疑错误在这里的某个地方:$jq("#redactor_content").redactor();,我需要做类似的事情:.redactor($jq);,但它打破了我的头脑,我无法猜测。

PS: 是的,我阅读了文档(http://docs.jquery.com/Using_jQuery_with_Other_Libraries)并尝试了不同的方法(交换库并尝试$.noConflictjQuery(document).ready...)。我写了一个例子,说明一切正常有点清晰。

我的第二个问题:它会一起工作吗:jQuery(document).ready(function() 和 Prototype 的document.observe("dom:loaded", function(),如果没有,如何一起工作?

谢谢。

【问题讨论】:

  • 你有没有为你的代码尝试过这个结构(不是编辑器)(function($){ // Code... })(jQuery);
  • 是的,我试图做类似的事情: 但我不记得结果是什么。只是不工作。
  • 当你使用 "(function($){...})(jQuery);" 时,你不需要 "$(document).ready("。还要记住你必须在使用之前加载 redactor.js。所以正确的顺序是:jQuery、redactor、prototype、yout 脚本。
  • 但是这个"$(document).ready("是要在DOM加载完之后执行的。如果我把它去掉,那就有不一样的意思了。

标签: jquery ajax prototypejs conflict


【解决方案1】:

据我所知,这应该可行。唯一可能出错的是 redactor.js 在其代码中的某处需要 $-assignment(这将是一个错误),但它似乎可以正确处理。

您可以先加载原型,然后加载 jquery + redactor.js,然后使用 jQuery.noConflict() 来测试它(将 $-operator 切换回之前的值,在本例中为原型)。

顺便说一句,如果没有弹出第二个警报,我预计控制台中会出现一些错误,这也是相关信息。

关于您的第二个问题:是的,这两种方法都应该可以正常工作。但你当然只需要 1 个 :)。

【讨论】:

  • 是的,控制台:“TypeError: 'undefined' is not a function (evalating 'this.opts.css[key].substr(0,1)')”这里(redactor.js): for (key in this.opts.css) { if (this.opts.css[key].substr(0,1) != '/') this.cssUrl[key] = this.opts.pathCss + this.opts .css[键];否则 this.cssUrl[key] = this.opts.css[key]; }
  • 谢谢!我能用它做什么?为什么我只需要一种方法?
  • 你只需要1,因为它们都做同样的事情,并不是说你只能在一个中使用jQuery,而在另一个中只能使用原型。如果问题出在 redactor.js 中,则很难调试。也许您应该将其标记为 redactor.js 的错误。
【解决方案2】:

尝试替换

<script>
    var $jq = jQuery.noConflict();
    $jq(document).ready(function(){
        alert("123");
        $jq("#redactor_content").redactor();
        alert("456");
    });
</script>

<script>
(function($){
    $(document).ready(function(){
        alert("123");
        $("#redactor_content").redactor();
        alert("456");
    });
})(jQuery);  
</script>

【讨论】:

  • 不幸的是,我只看到“123” :(
  • 没有 "$(document).ready(function(){" - 它可以工作,但我需要在 DOM 完全加载时执行代码
  • @Vladislav 您必须按此顺序包含 jQuery、redactor.js、自定义脚本,然后是原型。
  • 没有区别。我只看到“123”。
  • 没有 "$(document).ready(function(){" 的情况相同 - 有效(参见 "123456")。因此,这意味着只有在prototype.js 还没有时才执行代码已加载。
猜你喜欢
  • 1970-01-01
  • 2016-04-23
  • 2014-09-21
  • 1970-01-01
  • 2023-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多