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 + "&instance=" + szInstanceName, "_blank", "width=400,height=170,top="+event.clientY+",left="+(event.clientX-150));
}
方法 ntpOpenLoader()
有两个上下文:第一个是方法 ntpDeleteImage,第二个是直接来自模板代码(参见上面的模板代码)。
当我直接从模板代码 运行 ntpOpenLoader()
时,它工作正常。
当我从 ntpDeleteImage()
上下文 运行 ntpOpenLoader()
时,我的跨度 dom 看不到父级。实际上,我认为我的跨度(使用 NTPOpenLoader class)无法正确检索父项。
从 Chrome 调试这个我在控制台中如下:
在(模板上下文)控制台中 return。
[div#main_picture,prevObject:n.fn.init[1],上下文:span.NTPOpenLoader]
在来自 ntpDeleteImage 的 运行ning 上下文中,我有:
[prev对象:n.fn.init[1],上下文:span.NTPOpenLoader]
这意味着我有一个没有父对象的对象。
请帮我找出错误并纠正我的错误。
我完全是白痴,忘记了 onclick 事件绑定中 elem 的上下文。正确的调用是 ntpOpenLoader(this)。现在一切正常。
谢谢大家!
我必须开发一个非常大的平台,我需要对一些插件进行一些改进。
基本上,我有一个使用 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 + "&instance=" + szInstanceName, "_blank", "width=400,height=170,top="+event.clientY+",left="+(event.clientX-150));
}
方法 ntpOpenLoader()
有两个上下文:第一个是方法 ntpDeleteImage,第二个是直接来自模板代码(参见上面的模板代码)。
当我直接从模板代码 运行 ntpOpenLoader()
时,它工作正常。
当我从 ntpDeleteImage()
上下文 运行 ntpOpenLoader()
时,我的跨度 dom 看不到父级。实际上,我认为我的跨度(使用 NTPOpenLoader class)无法正确检索父项。
从 Chrome 调试这个我在控制台中如下:
在(模板上下文)控制台中 return。 [div#main_picture,prevObject:n.fn.init[1],上下文:span.NTPOpenLoader]
在来自 ntpDeleteImage 的 运行ning 上下文中,我有: [prev对象:n.fn.init[1],上下文:span.NTPOpenLoader]
这意味着我有一个没有父对象的对象。 请帮我找出错误并纠正我的错误。
我完全是白痴,忘记了 onclick 事件绑定中 elem 的上下文。正确的调用是 ntpOpenLoader(this)。现在一切正常。
谢谢大家!