为什么jQuery不会加载到Facebook?

Cri*_*low 16 javascript jquery facebook google-chrome-extension google-chrome-devtools

情况:我正在编写适用于任何页面的chrome扩展.

问题问题:我无法将jQuery加载到Facebook中,我想了解发生了什么.

假设:Facebook拥有一些超级先进的技术,以某种方式检测到两者:

  1. 当jQuery通过chrome扩展在一个表面上独立的 JSVM执行上下文中加载时,Facebook megamind以某种方式知道这个表面上独立的 JSVM执行上下文,并阻止它.
  2. jQuery是通过script.src加载并阻止的 (当我使用通过HTTPS服务的谷歌CDN而不是方法2不起作用的jQuery时,但不足以回答).

数据

我怎么知道jQuery没有加载?

j在Chrome中调出控制台.当我做 :

    > jQuery
    >> ReferenceError : jQuery is not defined.
    > $('body')
    >> Error : Tried to get element "body" but it is not present on the page.
Run Code Online (Sandbox Code Playgroud)

我如何尝试在Facebook中加载jQuery?

方法1(必需但失败):

通过manifest.json文件中的以下代码:

"content_scripts"         :   [
                                  {
                                    "matches"   : ["<all_urls>"],
                                    "js"        : [ 
                                                    "javascript/jq/jquery-1.9.1.min.js",                                            
                                                    "javascript/jq/non-standard.js"
                                                  ],
                                    "all_frames": true // (or false, same failure)
                                  } 
                              ]
Run Code Online (Sandbox Code Playgroud)

方法2(有效,但不充分):

通过本SO答案(将jQuery加载到控制台)中描述的方法,修改为允许正确的协议:

    var jq = document.createElement('script');
    jq.src = "//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js";
    document.getElementsByTagName('head')[0].appendChild(jq);
    jQuery.noConflict();
Run Code Online (Sandbox Code Playgroud)

摘要

假设1似乎不太可能,因为忽略Web浏览器的单独执行上下文将是一个主要的安全漏洞(打破沙箱),并且不太可能被制裁.因此,我可能是偏执狂,俯视明显的,希望你们中的一个人会看到.

附录(其他相关代码)

所有非standard.js:

    $.fn.in_groups_of = function( countPerGroup ) {
        var groups = [], offset = 0, $group;
        while ( ($group = this.slice( offset, (countPerGroup + offset) )).length ) {
            groups.push( $group );
            offset += countPerGroup;
        }
        return groups;
    };
Run Code Online (Sandbox Code Playgroud)

更多manifest.json:

"manifest_version"        :   2,
"permissions"             :   [
                                  "http://*/",
                                  "https://*/",
                                  "tabs",
                                  "storage",
                                  "unlimitedStorage"
                              ],
Run Code Online (Sandbox Code Playgroud)

Rob*_*b W 45

Chrome控制台似乎无法访问内容脚本的执行上下文.

错了,确实如此.你需要看看正确的地方:

如何访问Chromne扩展的执行环境的动画

之前的截屏视频显示,Chrome开发者工具的控制台选项卡底部有两个下拉框,可用于更改开发人员工具控制台的执行环境.
左侧可用于更改帧上下文(顶部框架,因此iframe,...),右侧可用于更改脚本上下文(页面,内容脚本,...).

  • 这是我见过的最棒的答案.它需要为主题动画GIF上调10,000次才能完全回答问题并教我五个新事物.你是怎么做那个gif的? (4认同)
  • @CrisStringfellow我正在使用Byzanz.有关启动该工具的shell脚本,请参阅[Ask Ubuntu上的此答案](http://askubuntu.com/a/201018/45058).生成的GIF具有合理的质量和尺寸.例如,看看[这个动画](https://rob.lekensteyn.nl/youtubelyrics/screenshots/40seconds.gif).它的持续时间为40秒,仅*3.7Mb. (3认同)