2009-10-25 2 views
6

Я просто возился с пользовательскими скриптами в хроме прямо сейчас, поэтому, пожалуйста, воздержитесь от моего потенциального невежества/идиотизма.Как я могу имитировать функции небезопасного браузера Greasemonkey/Firefox в Chrome?

На странице, на которой я пишу скрипт, есть элемент <script>, который объявляет переменную x. Означает ли это, что в моем пользовательском скрипте я могу просто получить доступ к x из глобального пространства имен?

Например, если единственная строка в моем usercript - alert(x);, должна ли она работать как ожидалось (предполагается, что x - это строка)? Я понимаю, что хром не поддерживает unsafewindow, но по какой-то причине мне не удается понять, как имитировать функциональность. Возможно ли это?

ответ

9

contentWindow был доступен в Chrome 3, но removed in Chrome 4. Только возможное решение для Chrome 4:

location.href="javascript:(function(){ alert('Hello'); })()" 
0

нормально Heres идея вы можете вводить скрипт, используя адресную строку ...

javascript:var ElEm = document.createElement("script");ElEm.src='[path_to_script]';document.body.appendChild(ElEm); 

, то вы можете запустить все, что вы хотите в окне с JavaScript

+0

ой и если переменная является глобальной для страницы вы должны быть в состоянии прочитать его с вашим javascript –

13

Это даст вам ссылку на объект окна (как р):

var p = unsafeWindow; 

if(window.navigator.vendor.match(/Google/)) { 
    var div = document.createElement("div"); 
    div.setAttribute("onclick", "return window;"); 
    p = div.onclick(); 
}; 
+0

благодарит вас – ysth

+6

Нет необходимости в «обнюхивании вендора», вы можете просто сделать что-то вроде этого: https://gist.github.com/1143845 –

+7

Это, похоже, больше не работает в последнее время версии Chrome. –

1

Если у ou хотите взаимодействовать со страничным JavaScript, вам придется вставить скрипт в страницу. (Если вы не хотите использовать какие-либо хаки, предложенные на этой странице, конечно.) Я приготовил функцию, чтобы сделать это только для моих собственных скриптов, я отправлю ее здесь, если кто-то захочет ее использовать.

/* 
    @description This function will insert the given code as a <script> or <style> block into a page. 
    @param The code to insert; supported types are: JavaScript Function, String (JavaScript), String (CSS). 
    @param2 Optional: The type of code that is inserted. If omitted, "js" is assumed. Possible values are 'js' or 'css'. 
    @return The HTML element that was inserted, or FALSE on failure 
*/ 
function insert(z,t){ 
    var j,f,x,c,i,n,d 
    d=document 
    c=d.createElement 
    i=d.head.appendChild 
    a=d.createTextNode 
    if(typeof z==='function') j=!0,f=!0; 
    if((t=='js'||!t)&&!f){j=!0,f=!1} 
    if(t=='css'&&!j){x=c('style');x.setAttribute('type','text/css')} 
    if(j){x=c('script');x.setAttribute('type','text/javascript')} 
    if(f) n=a('('+z+')()');else n=a(z) 
    x.appendChild(n) 

    if(x){return i(x)}else{return !1} 
} 

Несколько примеров уточнить:

//Inserting a JavaScript function 
var func=function(){ 
    stopAds(); 
    startFileDownload(); 
} 

insert(func); 


//Inserting JavaScript as a string 
var strJS="prompt(\"Copy:\",someVariableAtThePage);"; 

insert(strJS); 
//Or with an OPTIONAL 2nd parameter: 
insert(strJS,'js'); 


//Inserting CSS 
var strCSS=".ad{display:none !important} #downloadButton{display:block}"; 

insert(strCSS,'css');//Specifying 2nd parameter as "css" is required. 
11

Update:
onclick не использовать больше не работает в последних Chrome релизы.

Чтобы получить функциональность в Chrome, лучше всего установить и использовать Tampermonkey - что бы вы были умны делать, независимо. Tampermonkey имеет полную поддержку API Greasemonkey и значительно упрощает управление сценарием.

Сценарии Greasemonkey и скрипты Tampermonkey почти всегда полностью совместимы, что не так для обычных пользовательских скриптов Chrome.

Отказ от Tampermonkey, единственной альтернативой, которая все еще работает, является использование некоторой формы script injection.



Следующая является устаревшим:

Chrome now defines unsafeWindow for userscripts/content-scripts, но в Chrome unsafeWindow еще не позволяет получать доступ к объектам JS, созданных целевой страницы.

Вот как обеспечить правильно небезопасным, unsafeWindow - в кросс-браузерный способ, который использует Feature Detection (good) versus Browser Sniffing (Bad):

/*--- Create a proper unsafeWindow object on browsers where it doesn't exist 
    (Chrome, mainly). 
    Chrome now defines unsafeWindow, but does not give it the same access to 
    a page's javascript that a properly unsafe, unsafeWindow has. 
    This code remedies that. 
*/ 
var bGreasemonkeyServiceDefined  = false; 

try { 
    if (typeof Components.interfaces.gmIGreasemonkeyService === "object") { 
     bGreasemonkeyServiceDefined = true; 
    } 
} 
catch (err) { 
    //Ignore. 
} 

if (typeof unsafeWindow === "undefined" || ! bGreasemonkeyServiceDefined) { 
    unsafeWindow = (function() { 
     var dummyElem = document.createElement('p'); 
     dummyElem.setAttribute ('onclick', 'return window;'); 
     return dummyElem.onclick(); 
    })(); 
} 
+0

Это все еще работает? Я попробовал его в chrome, чтобы переопределить отправку XHR, но он ничего не делает. я просто добавил: 'var oldSend = unsafeWindow.XMLHttpRequest.prototype.send; unsafeWindow.XMLHttpRequest.prototype.send = function() {console.log ("уведомление об обновлении XHR"); oldSend.apply (это, аргументы); } ', но я не получаю никакого результата во время запросов. этот код производит вывод, если я ввожу его на страницу. – mix

+0

@Mix, Да, я только что подтвердил, что он по-прежнему работает в Chrome версии 18 и версии 19 (19.0.1084.56 м). Откройте новый вопрос для своей проблемы. –

+0

не работает в chrome no – user280109

 Смежные вопросы

  • Нет связанных вопросов^_^