在我上一个问题之后,我想出了以下工作代码,旨在通过替换<div id="test_css_id">...</div>
本身来定期刷新 DOM。以下代码中存在的两个 AJAX 请求的行为是重新加载相同的代码本身。
<div id="test_css_id">
<a id="link_css_id" href="test_url.html">LINK</a>
<script type="text/javascript">
var refreshTimer;
$('#link_css_id').click(function(event) {
event.preventDefault();
$.ajax({
url: $(this).attr('href'),
type: 'PUT',
success: function(data) {
clearInterval(refreshTimer);
$('#test_css_id').replaceWith(data); // Replaces all code including JavaScript with the response data (note: the response data is exactly the same as the code shown here).
}
});
});
$(document).ready(function() {
function refreshFunction(){
$.ajax({
url: 'test_url.html',
type: 'GET',
success: function(data) {
clearInterval(refreshTimer);
$('#test_css_id').replaceWith(data); // Replaces all code including JavaScript with the response data (note: the response data is exactly the same as the code shown here).
}
});
}
refreshTimer = setInterval(refreshFunction, 1000);
});
</script>
</div>
然而,正如接受答案的作者所说,"还有其他方法可以做到这一点[..]。一种方法是将所有代码包装到一个模块中"。我不是JavaScript的专家,但我想更多地理解和学习它。
如何将所有这些代码包装到一个模块中以避免使用全局变量?
您当前的代码如下所示:
var refreshTimer; //a global variable
$(...).click(...);
要使 refreshTimer 不是全局的,您需要将其放在一个函数中:
function main(){
var refresherTimer; //this variable is now local to "main"
$(...).click(...);
}
main();
但是,这样做并不能完全解决问题。虽然我们确实摆脱了全局变量,但我们添加了一个新的变量 - "main"函数本身。
最后一个技巧是将"main"函数转换为匿名函数并直接调用它。这就是著名的"模块模式":
(function(){
var refreshTimer; //local variable to that anonymous function
$(...).click(...);
}()); //and here we call the function to run the code inside it.
所有内容周围的额外括号很重要。如果您只执行function(){}()
而不是(function(){}())
,则会出现语法错误。
这是对 JavaScript 中模块模式的一个很好的描述。