2016-12-02 114 views
1

我在我無法編輯的網頁上工作客戶端。獲取JavaScript對象

我想用JS來點擊一個特定的按鈕,但它沒有唯一的標識符。

我知道這個類,我知道我可以匹配的innerHTML中的一個(唯一)字符串,所以我通過while循環尋找字符串遍歷(不同數量)的按鈕:

var theResult = ''; 
var buttonNum = 0; 
var searchString = '720p'; 
while (theResult.indexOf(searchString) == -1 
{ 
    theResult = eval(\"document.getElementsByClassName('streamButton')[\" + buttonNum + \"].innerHTML\"); 
    buttonNum++; 
} 

現在我應該知道按鈕陣列中的正確位置(buttonNum-1,我認爲),但我該如何引用?我曾嘗試過:

eval(\"document.getElementsByClassName('streamButton')[\" + buttonNum-1 + \"].click()") 

和()的位置在eval中的變化,但我無法讓它工作。

+0

我不知道你有什麼向下投票,似乎是一個非常有效的問題。雖然我不確定一些事情。你說你無法編輯頁面,你只是在瀏覽器控制檯中運行這個JavaScript?你需要這樣做嗎? – Shaded

+0

是的,我在本地運行它,這是因爲我試圖獲取一些數據,只有通過單擊此按鈕加載的頁面上可用。 – Lorccan

+2

爲什麼使用eval? – Fefux

回答

0

你不需要的EVAL,但你可以檢查所有的按鈕逐一隻要按一下按鈕立即當你找到它,所以你不必再找到它。

它不像@Shilly所建議的那樣高雅,但如果您是JavaScript新手,可能會更容易理解。

var searchString = '720p'; 
 
var buttons = document.getElementsByClassName("streamButton"); // find all streamButtons 
 
if(buttons) 
 
{ 
 
    // Search all streamButtons until you find the right one 
 
    for(var i = 0; i < buttons.length; i++) 
 
    { 
 
     var button = buttons[i]; 
 
     var buttonInnerHtml = button.innerHTML; 
 
     if (buttonInnerHtml.indexOf(searchString) != -1) { 
 
     button.click(); 
 
     break; 
 
     } 
 
    } 
 
} 
 

 
function allOtherClick() { 
 
    console.log("Wrong button clicked"); 
 
} 
 

 
function correctButtonClick() { 
 
    console.log("Right button clicked"); 
 
}
<button class='streamButton' onclick='allOtherClick()'>10</button> 
 
<button class='streamButton' onclick='allOtherClick()'>30</button> 
 
<button class='streamButton' onclick='correctButtonClick()'>720p</button> 
 
<button class='streamButton' onclick='allOtherClick()'>abcd</button>

+0

我想我會因爲你的建議(因爲我是JS的新手)得到這個比其他答案更多。我有幾個問題:行:var button = document.getElementsByClassName('streamButton')[「+ buttonNum +」]「;似乎有點混亂關於連接,這是你的意思寫它? searchString包含在innerHTML中,所以它的長度不一樣,所以我已經處理了這個檢查。 – Lorccan

+0

@Lorccan你說得對,在發佈之前我必須修正javascript。我已經更新它來修復它(並且刪除了完全匹配檢查,因爲它不是你想要的)。 如果這是你的答案,請接受它。 :) 如果還有其他東西我想念讓我知道! – pulekies

+0

@Lorccan其實我又看了一遍這個答案,我將它固定爲使用一個簡單的'for'循環。上次我無緣無故地一遍又一遍地讀取所有按鈕。 – pulekies

0

我會在這裏保持清除eval,如果按鈕上的文本是一些惡意的javaScript?

你可以使用jQuery嗎?如果是這樣,請查看contains。您可以使用它像這樣:

$(".streamButton:contains('720p')") 
+0

謝謝,但我需要使用標準的JS。 – Lorccan

4

你可以嘗試這樣的:

var searchStr = '720p', 
    // Grab all buttons that have the class 'streambutton'. 
    buttons = Array.prototype.slice.call(document.querySelectorAll('button.streamButton')), 
    // Filter all the buttons and select the first one that has the sreachStr in its innerHTML. 
    buttonToClick = buttons.filter(function(button) { 
     return button.innerHTML.indexOf(searchStr) !== -1; 
    })[0]; 
+0

您是否可以添加實際上會點擊按鈕的代碼? – Shaded

+1

只需在末尾添加'buttonToClick.click()' – Fefux

+0

謝謝。我與其他解決方案一起使用,因爲它對於我的JS級別更加清晰,但我會研究你的代碼以確保我能夠得到它。 – Lorccan