jQuery在某些网站中不起作用

时间:2014-09-01 04:55:46

标签: jquery

例如,打开http://camel.apache.org/, 然后在Chrome或Firefox中打开控制台, 执行jQuery注入的代码:

var jq = document.createElement('script');
jq.src = "//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.js";
document.getElementsByTagName('head')[0].appendChild(jq);

会收到错误:

Uncaught TypeError: undefined is not a function 

在jQuery.js第3536行:

return readyList.promise( obj ); // 'promise' is an undefined function.

2 个答案:

答案 0 :(得分:0)

在同一页面中添加:

var jq = document.createElement('script');
jq.src = "https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.js";
document.getElementsByTagName('head')[0].appendChild(jq);

它会起作用。

当您使用//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.js而没有https:http:时,它会根据某些因素自动尝试获取其中一个。在这种情况下,它会尝试获取http:,但该网站只接受对https:的引用,因此会失败。

以下是另一篇文章的引用:

  

使用与协议无关的绝对值   路径:

<img src="//domain.com/img/logo.png"/>
     

如果浏览器正在查看页面   SSL通过HTTPS,然后它会请求   使用https协议的资产,   否则它会用HTTP请求它。

     

这可以防止这个页面太糟糕了   包含安全和非安全   项&#34; IE中的错误消息,保持   您的所有资产请求   相同的协议。

     

警告:在<link>上使用时   @import用于样式表,IE7和IE8   download the file twice。所有其他   然而,用途很好。

答案 1 :(得分:0)

回答我的问题:

有些网站定义了Object的原型,例如:

  if (!Object.prototype.extend) {
    Object.prototype.extend = function(){}
  }

它会打破jQuery。

以下是类似问题Prototyping Object in Javascript breaks jQuery?

an advice from John Resig we're looking into for the future, but please don't do it, regardless of the state of jQuery.

它发布于6年前,但似乎无法解决。

以下是来自the bug ticket的解决方案:

    for (var i in O) {
        if (!O.hasOwnProperty(i)) { continue; }// Add this to all `for...in` loops
        // other code stays unchanged
    }

但是这样,你必须创建一个自定义的jQuery(所以你不能从公共CDN导入jQuery)。