Jquery 未动态找到 dom 父级

Jquery doesn't find dynamicaly dom parent

我必须开发一个非常大的平台,我需要对一些插件进行一些改进。

基本上,我有一个使用 smarty 作为引擎的模板(这无关紧要)并且我在该模板中有以下代码:

<div class="imageLoader">
  <div id="main_picture" data-instance="article" data-location="{$smarty.session.CONFIG.DIR.C_PHOTOS_DIR}">
    {if $data.main_picture}
    <input type='hidden' name='main_picture' value="{$data.main_picture}" />
    <img src="{$smarty.session.CONFIG.DIR.C_PHOTOS_DIR}{$data.main_picture}" />
    <span class="NTPDelete" onclick="javascript: ntpDeleteImage(this);">
    {$smarty.session.language.ntp.delete}
    </span>
    {else}
    <span class="NTPOpenLoader" onclick='javascript: ntpOpenLoader(this);'>
    {$smarty.session.language.ntp.add}
    </span>
    {/if}
  </div>
</div>

我还有一个包含这段代码的js脚本:

    function ntpDeleteImage(elem) {
        var parent = $(elem).parent();
        var szInstanceName = $(parent).attr('data-instance');

        var params = {
                'filename' : encodeURI($(parent).find('input').val()),
                'instance': szInstanceName
        };

        $.post("./ajax/ntp.delete.php", params, function(data){
        })

        .done(function(data){
            $(parent).find('img, span').remove();
            $(parent).find('input').val('');

            $("<span />", {
                class: 'NTPOpenLoader'
            }).html(ntpAddPictureText).appendTo(parent);

            $(parent).on('click', 'span.NTPOpenLoader', function(){
                ntpOpenLoader(elem);
            });
        });
    }

function ntpOpenLoader(elem){
    var parent = $(elem).parent();
    var szInstanceName = $(parent).attr('data-instance');

    console.log(parent);

    window.open("ntp.loader.php?id=" + parent[0].id + "&amp;instance=" + szInstanceName, "_blank", "width=400,height=170,top="+event.clientY+",left="+(event.clientX-150));
}

方法 ntpOpenLoader() 有两个上下文:第一个是方法 ntpDeleteImage,第二个是直接来自模板代码(参见上面的模板代码)。

当我直接从模板代码 运行 ntpOpenLoader() 时,它工作正常。 当我从 ntpDeleteImage() 上下文 运行 ntpOpenLoader() 时,我的跨度 dom 看不到父级。实际上,我认为我的跨度(使用 NTPOpenLoader class)无法正确检索父项。

从 Chrome 调试这个我在控制台中如下:

  1. 在(模板上下文)控制台中 return。 [div#main_picture,prevObject:n.fn.init[1],上下文:span.NTPOpenLoader]

  2. 在来自 ntpDeleteImage 的 运行ning 上下文中,我有: [prev对象:n.fn.init[1],上下文:span.NTPOpenLoader]

这意味着我有一个没有父对象的对象。 请帮我找出错误并纠正我的错误。

我完全是白痴,忘记了 onclick 事件绑定中 elem 的上下文。正确的调用是 ntpOpenLoader(this)。现在一切正常。

谢谢大家!