当有一个函数在 $(document).ready() 中
when has a function to be in $(document).ready()
我只是不明白。我搜索了又搜索,但为此我无法弄清楚什么是"正确的"。
有三个例子。
1( 小提琴 1.0在这里,我们html
了onlick="function"
和javascript
功能
<span class="classic one" onclick="someFunction(this,'one')">CLICK HERE</span>
<script type="text/javascript">
function someFunction(obj,nr) {
var string = $(obj).attr('class');
$('.result').text( string );
}
</script>
2( 小提琴 2.0然后,当我将函数移动到脚本部分(将其移动到.js文件(时,我收到错误"引用错误:未定义某些函数">
这就是问题开始的地方
3( 小提琴 3所以现在我在文档中有一个函数,可以使用 .on(单击它总是工作正常。此函数正在调用另一个位于 document.ready(( 之外的函数,并且工作正常。
所以问题来了。我什么时候必须定义函数的位置以及为什么它总是工作?
谢谢!
示例 3( 中的所有代码如下所示:
<div class="result">result</div>
<span class="classic one" onclick="someFunction(this,'one')">CLICK HERE</span>
<span class="classic two" onclick="someFunction(this,'two')">CLICK HERE</span>
<span class="classic three" onclick="someFunction(this,'three')">CLICK HERE</span>
<span class="classic four" onclick="someFunction(this,'four')">CLICK HERE</span>
<div class="ready">ready</div>
<span class="callOtherFunction">Call other function</span>
<script type="text/javascript">
$(document).ready(function(){
$('.ready').text( 'dom is ready' );
function someFunction(obj,nr) {
var string = $(obj).attr('class');
$('.result').text( string );
}
$( "span.callOtherFunction" ).on({
click: function() {
$(this).css("color","red");
$(this).addClass("xyz");
otherFunctionCallingFunction($(this));
}
});
});
function otherFunctionCallingFunction($me) {
$('.callOtherFunction').append( ' --> ' + $me.attr('class') );
}
</script>
你看到的很多东西都是因为 jsFiddle 非常令人惊讶的默认设置,即将代码包装在脚本窗格中的 onload
处理程序中。因此,您的代码被包装在一个函数中,不再在全局范围内(如果您使用 onclick
样式属性,这是函数需要的位置(。您可以使用左侧的下拉框(第二个,在库和脚本列表下(进行更改。将其更改为"无换行"以解开包装代码。
你不是(到目前为止!(第一个被这个令人惊讶的默认值咬的人。
回答您的主要问题:
当函数在 $(document(.ready(( 中时
如果你控制加载脚本的script
标签的位置,你基本上不必使用ready
;相反,只要确保你的script
标签在HTML的末尾,就在结束</body>
之前。
当然,您可以使用ready
。这样做的原因是确保在代码运行之前已创建所有 DOM 元素。但是,如果您将script
标签放在末尾,那已经是真的了。您仍然可以在ready
处理程序之外定义函数(如果您希望它们是全局变量(,但是如果您使用的是 ready
,您将从ready
处理程序调用它们,以便元素存在。
FWIW,我会避免使用 onclick
样式的属性来连接事件处理程序,主要是因为它们需要您创建全局函数。当可以避免创建任何全局符号时,我宁愿避免创建任何全局符号。
我推荐的一般形式:
<!-- ...your page markup here... -->
<script src="any_libraries_you_need_if_you_are_not_combining.js"></script>
<script src="your_script.js"></script>
</body>
</html>
您的脚本如下所示:
(function($) { // A scoping function that wraps everything
// Hook up event handlers here. You can use `$` for jQuery, even if
// you've used noConflict, because we have a private `$` symbol (see
// the `$` argument above)
// The body of your code goes here
})(jQuery); // <== Note how we're passing the jQuery reference in
// and immediately executing the scoping function
下面是一个完整的示例:实时复制
<!DOCTYPE html>
<html>
<head>
<meta charset=utf-8 />
<title>Script Placement Example</title>
</head>
<body>
<input type="button" class="hello-button" value="Click me">
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script>
<script>
// This would be in a file, rather than inline
(function($) {
// Hook up handlers
$(".hello-button").click(sayHello);
// Body of the code
function sayHello() {
$("<p>Hello!</p>").appendTo(document.body);
}
})(jQuery);
</script>
</body>
</html>
在 JavaScript 中,作用域是按函数处理的。函数范围内的任何内容都可以访问该函数范围内的其他事物以及更广泛范围内的事物。
在函数中定义具有var
的变量会将该变量的范围限制为函数。
在另一个函数中使用函数声明定义一个函数会将定义的函数的范围限制为容器函数。
当你使用ready
时,你向它传递一个函数。当然,该函数中定义的任何内容都限定为该函数。由于它的作用域为该函数,因此它不是全局函数。您的 onclick 属性未在该函数的范围内定义,它只能访问全局变量。这就是您收到引用错误的原因。
避免全局变量。它们使事情难以维护。避免onclick
属性,它们通常依赖于全局变量。
如果您希望代码在完全构造 DOM 后运行,则需要使用 ready
。如果要使用 JS(例如使用 jQuery.on
(将事件处理程序绑定到其中的元素,这将很有用。执行此操作,而不是使用onclick
属性。
- jQuery document.ready not working
- jQuery document.ready停止代码
- 停止对document.ready函数的重定向/刷新
- 如果没有document.ready(),我怎么能拥有多个javascript函数呢
- ASPX Jquery 1.11 $(Document).ready(function() {} was skipped
- 为什么不'加载$(document.ready(function)后,单击“工作”
- 从Document.ready中的bundle执行javascript
- 从 document.ready 调用 jQuery 插件抛出 getPreventDefault 错误
- 调用 Document.ready 外部的 AJAX 函数
- jQuery "$(document).ready(function () {" equivalen
- 尝试触发点击document.ready中Bigcommerce Classic Next主题中的产品选项
- document.ready是在async js之后加载的
- 当在document.ready中使用async=true时会发生什么
- 说明ajax何时在document.ready中调用
- 如何在document.ready(function)时运行隐藏函数和动画
- HTML方法未使用Document Ready加载值
- 超越了在document.ready()中编写简单函数
- Javascript on click事件在函数中不起作用,但在document.ready()中起作用
- 为什么document.ready中的事件处理程序函数有效但无效;取出后不起作用
- 在document.ready jquery上运行ajax请求