2015-07-04 6 views
5

टीएल; डीआर: मैन्युअल जावास्क्रिप्ट को आग लगाने का प्रयास करना ट्विच के चैट बटन पर ईवेंट पर क्लिक करें, संदेश नहीं भेजेगा। समझ में नहीं आता कि घटना सामान्य क्लिक के समान क्यों नहीं करती है और यह नहीं जानता कि इसे कैसे काम करना है।ember.js में किसी बटन पर मैन्युअल क्लिक ईवेंट को फायर करने से आवश्यक परिणाम नहीं मिलता है

तो मैं twitch.tv के लिए कस्टम बॉट बनाने की कोशिश कर रहा हूं, केवल HTML से अपनी जानकारी पढ़ रहा हूं। मुझे यह पूरी तरह से उस बिंदु तक काम कर रहा है जहां यह आदेशों को पहचान सकता है और टेक्स्टबॉक्स में टेक्स्ट डाल सकता है। अब मेरी समस्या यह है कि, जैसे ही मैं "चैट" बटन पर मैन्युअल क्लिक ईवेंट को आग लगाने की कोशिश करता हूं, यह काम नहीं करता है। मेरा अनुमान है कि यह ember.js के साथ कुछ करने के लिए है, और मैं स्पष्ट रूप से इसके बारे में कुछ भी नहीं जानता। वैसे भी, यहां कोड का हिस्सा है जो काम नहीं करता है। संपादित करें: यह काम करता है अगर मैं इसे कंसोल में एकल के रूप में दर्ज करता हूं, हालांकि मेरे शेष कोड के संदर्भ में काम नहीं करता है।

<button class="button primary float-right send-chat-button" data-bindattr-3945="3945"> 
    <span> 
    Chat 
    </span> 
</button> 

जब मैं मैन्युअल रूप से इस पर एक क्लिक के ईवेंट को सक्रिय करने का प्रयास करें, कुछ नहीं होता:

$('.send-chat-button').click(); 

यहाँ क्या होता है कि मैं एचटीएमएल का एक टुकड़ा चैट बटन सबमिट करें कि प्राप्त है, जो इस है । हालांकि, जब मैं बटनकंटन.चल्डरेन [0] और बटनकंटन.चिल्डेरेन 1 (जो क्रमशः, दर्शक बटन की सेटिंग्स और सूची) पर मैन्युअल क्लिक ईवेंट को आग लगाता है, तो यह काम करता है। वे इस तरह दिखेगा:

<a data-ember-action="3943" class="button glyph-only float-left" title="Chat Settings"></a> 

मैं अंतर अनुमान लगा रहा हूँ डेटा-एंबर कार्रवाई और डेटा bindattr- * में है, लेकिन मैं यह काम करने के लिए कैसे पता नहीं है। यहां कोई भी जानता है कि क्लिक() ईवेंट क्यों काम नहीं करता है और सीधे क्लिक करता है?

संपादित करें: यदि आपके प्रश्न के बारे में आपके कोई प्रश्न हैं, तो बेझिझक पूछें।

EDIT2: मैंने थोड़ा और प्रयोग किया, और मैं बटन से सभी HTML विशेषताओं को हटा सकता हूं, और उस पर क्लिक करने से अभी भी काम करेगा। मुझे नहीं पता कि क्या :(चल रहा है EDIT3 है

:। ठीक है, तो यह है कि यह केवल कार्य करना बंद कर जब मैं बटन फिर भी पता नहीं क्या हो रहा है के भीतर स्पैन को दूर लगता है (हाँ, यह भी कोशिश की है। अवधि पर क्लिक ईवेंट को आग लगाने के लिए)

EDIT4: जैसा कि अनुरोध किया गया है, यहां मेरी तरफ से सभी कोड हैं। ध्यान दें कि मैं खुद को टच से बटन पर क्लिक करने की कोशिश कर रहा हूं, जिसमें से एम्बर साइड मेरे पास नहीं है कोड। इस कोड का उपयोग कंसोल में एक twitch.tv स्ट्रीम पर चिपकाकर और फिर इसे शुरू करने के लिए शुरू करने के द्वारा शुरू किया जाता है। मैसेज प्रोसेसिंग। मुझे बहुत सारे हार्डकोडेड मानों के लिए खेद है, वे जुड़वां फ़ील्ड हैं जिन्हें मुझे चाहिए। अभी के लिए मैं ' मैं बस अवधारणा का प्रमाण ढूंढ रहा हूं।

var frequency = 5000; 
var myInterval = 0; 
var lastMessageId = 0; 

function initiateMessageProcessing() { 
    if (myInterval > 0) { 
     clearInterval(myInterval); 
    } 

    myInterval = setInterval("checkMessages()", frequency); 
} 

function checkMessages() { 
    var chat = document.getElementsByClassName("chat-lines")[0]; 
    processMessages(extractUnprocessedMessages(chat.children)); 
    lastMessageId = parseInt(chat.lastElementChild.getAttribute("id").substring(5, 10)); 
} 

function extractUnprocessedMessages(chat) { 
    var unprocessedMessages = []; 
    var chatId = 0; 
    for (i = 0; i < chat.length; i++) { 
     chatId = parseInt(chat[i].getAttribute("id").substring(5, 10)); 
     if (chatId > lastMessageId) { 
      unprocessedMessages.push(chat[i]); 
     } 
    } 
    return unprocessedMessages; 
} 

function processMessages(unprocessedMessages) { 
    var messageElement; 
    for (i = 0; i < unprocessedMessages.length; i++) { 
     messageElement = unprocessedMessages[i].children[0].getElementsByClassName("message")[0]; 
     if (messageElement != undefined && messageElement != null) { 
      if (messageElement.innerHTML.search("!test") !== -1) { 
       sendMessage('Hello world!'); 
      } 
     } 
    } 
} 

function sendMessage(message) { 
    fillTextArea(message); 
    var button = $('.send-chat-button').get(0); 
    var event = new MouseEvent('click', { 
     bubbles : true 
    }); 
    button.dispatchEvent(event); 
} 

function fillTextArea(message){ 
    var textArea; 
    var chatInterface = document.getElementsByClassName("chat-interface")[0]; 
    var textAreaContain = chatInterface.children[0]; 
    textArea = textAreaContain.children[0].children[0]; 
    textArea.value = message; 
} 

EDIT5: Eventlistener स्क्रीनशॉट: eventlistener

EDIT6: संपादित स्रोत कोड $ उपयोग करने के लिए क्लिक करें(); ('send-चैट बटन।')। मैंने यह कोशिश की है, वर्तमान कोड में काम नहीं करता है, अगर चैट में टेक्स्ट होने पर मैं मैन्युअल रूप से कंसोल में इस एकल कमांड को फायर करता हूं तो यह काम करता है। लेकिन दुख की बात है कि मेरे कोड में काम नहीं करता है।

EDIT7: एम्बर.रुन का उपयोग किया गया, अभी भी काम नहीं करता है।

EDIT8: इस्तेमाल किया dispatchmouseevent, अभी भी कोड

+1

कृपया अधिक कोड प्रदान करें। –

+0

एक नज़र डालने के लिए धन्यवाद, मैंने पोस्ट में अपना पूरा कोड जोड़ा! – Gerdinand

+0

क्रोम पर, यदि आप तत्व टैब पर जाते हैं और उसके बाद शैलियों टैब के ठीक आगे होते हैं, तो घटनाओं के लिस्टर्न में देखने का विकल्प होता है, कोई भी गर्व नहीं होता है, यह सब कुछ होगा क्योंकि यह निर्भर करता है कि उस क्लिक के लिए टच कैसे सुन रहा है लेकिन यह आपको – Daemedeor

उत्तर

2

के संदर्भ में काम नहीं करता है ऐसा लगता है कि लक्ष्य साइट JQuery की मदद के बिना घटना श्रोताओं जुड़ जाता है।यदि ऐसा है, तो आप jquery .click() विधि का उपयोग करके इसे ट्रिगर नहीं कर सकते हैं।

आप सीधे इस तरह ब्राउज़र घटना मजाक की कोशिश कर सकते हैं:

var button = $('.send-chat-button').get(0); 
var event = new MouseEvent('click', {bubbles: true}); 
button.dispatchEvent(event); 

इस कोड IE8 और कम में काम नहीं करेगा, लेकिन मैं इसे अपने मामले नहीं है लगता है।

+0

एकमात्र समस्या यह है कि क्लिक() विधि काम करती है, लेकिन मेरे कोड के संदर्भ में नहीं, यह आपकी विधि के साथ समान है। – Gerdinand

+0

क्या आप सुनिश्चित हैं कि आपका क्लिक इवेंट काम नहीं करता है? मैं अभी साइट पर गया हूं (http://www.twitch.tv/mr_morjus) और कंसोल $ ('। Send-chat-button') में लिखा है। क्लिक करें() , और साइट ने संदेश पोस्ट करने के लिए मेरे लॉगिन का अनुरोध किया ... –

+0

यह काम करता है, लेकिन मेरे पूर्ण कोड के संदर्भ में नहीं, मैं अब मुख्य पोस्ट में अपना पूरा कोड अपडेट करूंगा – Gerdinand

0

कुछ क्रिया करने के लिए प्रोग्रामेटिक रूप से एक डोम तत्व पर क्लिक करना कुछ हद तक गलत दृष्टिकोण है।

आपको एक विधि myAction() परिभाषित करना चाहिए जिसे दो तरीकों से बुलाया जाना चाहिए। सबसे पहले, अपने एम्बर एक्शन ट्रिगर MyAction() और दूसरा, एक कस्टम इवेंट, "myEvent" सुनने के बाद।

$ ('भेजें-चैट-बटन') के बजाय।(); आप $ ('कुछ') कोड करेंगे। फिर ट्रिगर ("myEvent")।

कुछ की तरह:

Em.Controller.extend({ 

    myAction:function(){ 
     //do your stuff 
    }, 

    onMyEvent:function(){ 
     $('something').on('myEvent',this.myAction); 
    }.on('didInsertElement'), 

    actions:{ 
     triggerMyAction:function(){ 
      this.myAction(); 
     } 
    } 
}) 
+0

इस मामले में, myAction बटन पर क्लिक कर रहा है, इसलिए यह काम नहीं करेगा। मुझे पता नहीं है कि बटन (मिनीस्क्रिप्ट जावास्क्रिप्ट) पर क्लिक करने के बाद ट्विच क्या करता है, इसलिए इसे सीधे कॉल नहीं किया जा सकता है। – Gerdinand

1

मैं जानता हूँ कि इस पोस्ट काफी पुराना है, लेकिन मैं थोड़ी देर के और कुछ भी नहीं करने के लिए इस पर एक जवाब वास्तव में काम किया की तलाश में गया था, सामान के बहुत बाहर की कोशिश कर के बाद मैंने पाया यह काम करता है जब आप पहले चैटबॉक्स पर ध्यान केंद्रित करते हैं तो बटन पर फ़ोकस करें और फिर क्लिक ईवेंट को ट्रिगर करें !!! uuuhm हाँ ...

$('.chat_text_input').focus(); 
$('.send-chat-button').focus().trigger('click'); 

मुझे पता नहीं क्यों यह काम करता है (और क्यों यह किसी अन्य तरीके से नहीं करता है) यह असफल या बग बाहर बनाता है बाहर केन्द्रित है, लेकिन के किसी भी हो जाता है।

संबंधित मुद्दे

 संबंधित मुद्दे