Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/88.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript jQuery$(元素)在执行时未定义。单击()方法-在所有其他时间返回元素_Javascript_Jquery_Html_Asp.net - Fatal编程技术网

Javascript jQuery$(元素)在执行时未定义。单击()方法-在所有其他时间返回元素

Javascript jQuery$(元素)在执行时未定义。单击()方法-在所有其他时间返回元素,javascript,jquery,html,asp.net,Javascript,Jquery,Html,Asp.net,有一个同事面临的非常奇怪的问题,我设法解决了这个问题,但我一辈子都无法理解为什么他的初始代码不起作用我们有一个传统的asp.net web应用程序,它使用母版页/内容控件,并在整个web应用程序中混合使用jQuery,提供一些客户端交互 基本上,有一个web表单视图,其中有一个div,其中包含一个最初隐藏的按钮(display:none),单击另一个菜单项时,该div将使用jQuery BLOCKUI插件显示,阻止UI的其余部分并将弹出div呈现到位-用户可以单击该按钮,单击按钮应该隐藏包含的d

有一个同事面临的非常奇怪的问题,我设法解决了这个问题,但我一辈子都无法理解为什么他的初始代码不起作用我们有一个传统的asp.net web应用程序,它使用母版页/内容控件,并在整个web应用程序中混合使用jQuery,提供一些客户端交互

基本上,有一个web表单视图,其中有一个div,其中包含一个最初隐藏的按钮(display:none),单击另一个菜单项时,该div将使用jQuery BLOCKUI插件显示,阻止UI的其余部分并将弹出div呈现到位-用户可以单击该按钮,单击按钮应该隐藏包含的div,并显示另一个包含另外两个按钮的div-所有这些都应该很简单。。。。但这就是它变得古怪的地方:

请记住,这些内容都不是动态生成的,在页面加载完成后,所有HTML元素都会出现在.aspx视图中

 var blockUiRenderFrame = function (html, width, height) {
        window.parent.$.blockUI({
            message: html,
            css: {
                top: ($(window.parent).height() - height) / 2 + 'px',
                left: ($(window.parent).width() - width) / 2 + 'px',
                width: width
            }
        });
    };

<div id="anotherContentFrame">
    <p>some text</p>
</div>

<div id="contentFrame" style="display:none;">
    <div id="myButtonContainingDiv">
        <button id="aButton" />
    </div>
    <div id="myOtherButtonsContainingDiv"></div>
</div>

$(document).ready(function() {
    $("#myButton").click(function() { 
        $("#myButtonContainingDiv").hide();
        $("#myOtherButtonsContainingDiv").show();
    });
});

<!-- A Button on the page calls this code -->
blockUiRenderFrame($("#contentFrame"), 200, 200);
因为这是我获得对页面上DOM元素的任何引用以成功隐藏/显示它们的唯一方法

如果有人愿意,我可以尝试提供更多的信息,我不确定是否有人见过这样的问题


提前谢谢

您的事件没有触发,因为jQuery不知道元素,因为它的状态是动态更改的。为了确保触发单击事件,无论上下文如何,都可以使用

$(document).on('click','#myElement',function(){})

通过这样做,您将引用最简单的“非动态生成”元素,jQuery将始终能够找到您的元素

然后,您可以通过以下方式访问图元属性:

$(this)

显示你按钮的代码在哪里

调用
$(element)时,单击()
它将尝试绑定到已加载的DOM上的元素(没有异步元素!)。如果通过异步调用加载
#myButton
,则需要绑定父元素上的单击,然后将函数调用过滤到
#myButton
,如下所示:

$(document).on('click', '#myButton', function(){});

通过这种方式,您可以确保jQuery尝试绑定click事件时存在的元素(在本例中为document),并且只有在单击您指定为
.on()
调用的第二个参数的筛选器时才会触发该元素,在这种情况下,您的
#myButton
元素

是否可以制作小提琴?奇怪。如果看不到它的实际行动,很难提供帮助。无论如何,您可以像这样组合这些行:
$(this).closest('div').hide().next().show()我试图修改类似的代码-但它的执行与我预期的一样,所以没有添加到这里。唯一的区别是无法设置asp母版页和内容/等等。这是我见过的最奇怪的问题之一,但现在假设它是特定于实现的,与jQuery无关——因为我尝试了基本Javascript访问器,它们也不起作用#myButton是静态加载的-这是一件奇怪的事情,就像我在问题中提到的那样,除了在click处理程序中之外,我每次都可以访问该div元素。click元素执行得很好-我的变通代码执行得很好,我只是不明白为什么在click处理代码中,我不能简单地执行$(“#myButtonContainingDiv”).hide()-因为#myButtonContainingDiv在单击处理程序中返回undefined-在单击处理程序之外的任何时候,jQuery对象都会像您预期的那样返回。您不能这样做,因为jQuery当时不知道您的元素,因为它的状态是动态更改的,这就是为什么您必须引用最接近的“非动态更改”元素元素和$(document)通常是最简单的方法。我想您可能误解了我的奇怪问题-它确实存在,这是令人费解的部分-我在单击处理程序中访问$(this)时没有问题-以及注册单击事件的两种方法(document.on传播和通过(element).click()。我面临的问题不是click处理程序不起作用-它确实起作用,而是我无法访问$(“#myButtonContainingDiv”),当它在这个处理程序中时,当它在最初呈现的HTML中时,并且从未动态更改。
$(document).on('click', '#myButton', function(){});