2012-10-31 54 views
1

我創建了下面的Greasemonkey腳本來自動跳到我過去的蒸汽時代檢查網頁:表單屬性「未定義」在某些情況下錯誤,但不是別人

// ==UserScript== 
// ... 
// @include  http://store.steampowered.com/agecheck/* 
// ==/UserScript== 

//Mini script for doing steam age checks automatically 
if(document.URL.indexOf('agecheck') > -1) 
{ 
    var form = document.getElementById('agegate_box').getElementsByTagName('form')[0]; 
    form.ageDay.value = 18; 
    form.ageMonth.value = 'August'; 
    form.ageYear.value = 1987; 
    form.submit(); 
} 

這樣一個頁面的一個例子是: http://store.steampowered.com/agecheck/app/16730/。請注意,如果您設置了store.steampowered.com「生日期」cookie,則此頁面會自動跳到遊戲中,因此您可能必須先刪除它。

當這個greasemonkey腳本安裝在運行在Windows XP上的Firefox 17.0(beta)上時,它工作正常。

然後,我在我的Windows 7機器上運行最新的FF(16)上安裝了該腳本。在這臺機器上,當訪問form.ageDay時腳本中斷。錯誤控制檯顯示:

Error: form.ageDay is undefined 

更奇怪的是,雖然是,如果我只是我的腳本粘貼到Firefox的暫存器(Shift + F4)並執行它,它的工作原理查找和形式提交。

在XP上,GM腳本是如何工作的,而在Win7中腳本是在暫存器中工作,但是在Win7上腳本不能在GM中工作?另一個奇怪的是,在Win7機器上,如果我激活Firebug,var form顯然具有'ageDay'屬性,但watch表達式返回undefined?

enter image description here

+0

訪問形式的元素的這樣非常古老(「DOM level 0」)。也許通用汽車(部分?)放棄對它的支持?我不知道,只是一個猜測。 – bfavaretto

+0

我不熟悉GM腳本 - 但是他們可以在DOM準備好之前執行嗎?即表單尚未實際完成加載? – Matt

+0

@Matt GreaseMonkey腳本本身在'DOMContentLoaded'上執行:http://wiki.greasespot.net/DOMContentLoaded – Alain

回答

1

代碼不上Windows XP或Windows 7的也不應該爲我工作。 GM腳本不能(通常)使用那樣的命名錶單對象。見Greasemonkey Pitfall: Named Forms and Form Elements

使用沙箱安全(和更強大)的方法來獲取這些表單元素。例如,querySelector()。這個腳本工作對我來說,你的鏈接頁面上:

// ==UserScript== 
// @name  _delme 677 
// @include  http://store.steampowered.com/agecheck/* 
// @grant  GM_xmlhttpRequest 
// ==/UserScript== 

//Mini script for doing steam age checks automatically 
if (/agecheck/i.test (location.pathname)) { 
    var ageForm = document.querySelector ("#agegate_box form"); 
    ageForm.querySelector ("[name='ageDay']").value  = 18; 
    ageForm.querySelector ("[name='ageMonth']").value = 'August'; 
    ageForm.querySelector ("[name='ageYear']").value = 1987; 
    ageForm.submit(); 
} 

注:

  1. 火狐暫存工作,因爲它不是由GM沙箱隔離。
  2. 至於爲什麼它似乎在Win XP上工作,這很可能是一種僥倖 - 它不適用於我在XP上,它不應該。

    對於某些@grant none場景,可能有這種類型的代碼可能有效。 (@grant none在很多情況下默認應用;請參閱文檔)

    或者可能有多個版本的腳本正在運行,甚至FF已損壞並需要重新啓動。

    底線,就是不要這樣編碼。

  3. 至於but the watch expression returns undefined? ...這只是工作中的沙箱隔離,它在XP上對我來說看起來是一樣的。

  4. 代碼,就像使用querySelector()將幾乎所有的頁面的用戶可能會遇到,並就這個問題的參數範圍內肯定工作努力以上。但它目前不適用於某些可能 HTML5表單和一些無效某些網站據稱使用的HTML。

    在這兩種情況下,上面給出的陷阱鏈接中提到的代碼都可以工作,儘管存在某些無效的HTML或流血的HTML5,所提出的功能。

    具體地,該種代碼,而不夠靈活querySelector,將具有較寬組場景(即使它們是無效的HTML)工作:

    if (/agecheck/i.test (location.pathname)) { 
        var ageForm = document.querySelector ("#agegate_box form"); 
        ageForm.elements.namedItem ('ageDay').value  = 18; 
        ageForm.elements.namedItem ('ageMonth').value = 'August'; 
        ageForm.elements.namedItem ('ageYear').value = 1987; 
        ageForm.submit(); 
    } 
    
+1

你已經完成了。非常感謝您尋找解決方案,解釋和美麗的代碼。我只在寫javascript的第4天,所以有3個偉大的新事物在我身邊:p – Alain

+0

不客氣;樂意效勞。 –

+0

呃......正確的做法是'ageForm.elements.namedItem('ageDay')'。使用'querySelector'將會在各種情況下失敗...... –

相關問題