2013-04-11 62 views
1

我的html表单上的输入有问题。确实,我正在将这个输入的twitter名称放入一个Ajax函数中,该函数通过twitter从api中调用了推文。 由于我有一个setInterval函数来检查更新,输入一次又一次地传递给函数来获取推文。为什么我的函数会继续从我的输入文本字段中读取输入内容?

问题是该函数似乎直接从文本输入框中的内容读取输入。因此,如果用户在没有按下输入按钮或按下按钮的情况下更改文本,该功能会不断读取该文本作为输入。因此,在输入或按下按钮提交后,最初输入的输入不是固定的。

这里是HTML表单以输入:

<div id="topdiv">Input Twitter ID: <input type="text" id="userid" onkeydown="if(event.keyCode===13) {document.getElementById('tweet-button').click();}"> 
<input type="submit" id="tweet-button" onclick="getStatusesX();" value="Get recent tweets"> 
<p id="tweetbox"></p> 
</div> 

这里的功能是:

function getStatusesX() { 

    var userID = document.getElementById("userid").value; 
    getStatuses(userID); 
    var intervalstop = setInterval(function() {getStatuses(userID);}, 20000); 
    clearInterval(intervalstop);} 

//Create a cross-browser XMLHttp Request object 
function getXMLHttp() { 

    var xmlhttp; 
    if (window.ActiveXObject) { 
     XMLHttp = new ActiveXObject("Microsoft.XMLHTTP"); 
    } else if (window.XMLHttpRequest) { 
     XMLHttp = new XMLHttpRequest(); 
    } else { 
     alert("Your browser does not support XMLHTTP!"); 
    } 
    return XMLHttp; 
} 

//function that searches for the tweets via php 
function getStatuses(userID){ 

XMLHttp1 = getXMLHttp(); 

    //ajax call to a php file that will extract the tweets 
    XMLHttp1.open('GET', 'TwitterGlimpsePHP.php?userid='userID, true); 

    // Process the data when the ajax object changes its state 
    XMLHttp1.onreadystatechange = function() { 
     if(XMLHttp1.readyState == 4) { 
      if(XMLHttp1.status ==200) { //no problem has been detected 
       document.getElementById("tweetbox").innerHTML=XMLHttp1.responseText; 
      } 
     } 
    } 
    XMLHttp1.send(null); 
} 

我想作为文本按下ENTER后应采取的输入。我曾尝试将其分配给变量,但无法解决为什么它始终从输入字段进行读取。任何帮助赞赏。

+0

难道是因为你正在为getStatuses设置一个间隔调用,因此每次调用时都会重新执行代码,因此每次都从输入框中获取文本。 – 2013-04-11 20:56:00

+0

您可以禁用输入或其他...按照您的功能方式,您只需点击一次即可调用它n次 – Hackerman 2013-04-11 20:57:17

+2

因此,每次用户单击输入或提交查询时,它都会增加间隔?您应该在getStatusesX函数中将其指定为var和clearInterval(var) – 2013-04-11 21:00:39

回答

2

这不是一个官方的答案 - 只是想清理我的意见

这就是我的意思是在函数外声明...

var intervalstop; 

function getStatusesX() { 
    clearInterval(intervalstop); 

    var userID = document.getElementById("userid").value; 
    getStatuses(userID); 
    intervalstop = setInterval(function() {getStatuses(userID);}, 20000); 

} 

这样你初始化var和内您首先清除的功能,以确保它不复合。然后,将var设置为新的时间间隔以重新开始。

你说twitter不喜欢这个代码的东西,如果用户点击很多次 - 非常有意义。他们会想要限制API以防止某人由于不正确编码而每分钟发出50,000个请求。您应该检查API规范以确保您处于现实区域内,并考虑在本地缓存结果(如果您正在推进边界)。

1

问题在于,每次调用getStatuses时都要重新读取文本框的值。

先尝试捕捉文本框的值,并将其传递到您的getStatuses功能:

因此新getStatusesX是:

function getStatusesX() { 
    var userID = document.getElementById("userid").value; 
    getStatuses(userID); 
    setInterval(function() { 
     getStatuses(userID); 
    }, 20000); 
} 

更新getStatuses采取userid参数和删除行,其中你正在读取getStatuses中的文本框的值。

如前所述,这可能是一个问题,如果有可能开始 - 如果用户单击按钮多次自动刷新状态会怎么样?您可能想要在点击按钮/文本框后禁用它,或者先清除旧的时间间隔。

+0

我已经编辑了我上面的代码给你的建议。在应用更改后,它并未执行getStatusesX()。 – user1835504 2013-04-11 21:46:32

+0

其实很好,只是混合了我的java和javascript语法。不幸的是,当按钮或输入被多次点击时,我现在有问题。 Twitter不喜欢那样。谢谢您的帮助。 – user1835504 2013-04-11 22:31:10

相关问题