我创建了一个CalendarViewerPortlet自定义对象JS对象。在这个对象中,我存储的东西,如portlet的id和它的上下文路径。该对象还有许多自定义方法,一些用于获取/设置成员变量,一些用于执行特定的操作。
当我尝试使用“this”引用对象的功能时。在jQuery函数内部,它会爆炸。我知道在这个上下文中的术语“this”可能指的是其他东西,但我不知道如何绕过这个问题并让它引用该对象,就像我想要的那样。
以下是有问题的代码:
jQuery.ajax({
url: jQuery(formSel).attr("action"),
type: "POST",
data: jQuery(formSel).serialize(),
beforeSend: function(xhr) {
jQuery(msgSel).hide();
jQuery(msgSel).html("");
jQuery(tableSel).hide();
jQuery(pagerSel).hide();
jQuery(cpSelector).block({
message: "<img src='"+this.getContextPath()+"/images/icon_loading.gif' align='absmiddle' alt='Loading...' /> Fetching events..."
});
},
注意“this.getContextPath()”。这就是代码失败的地方。我试图引用我的自定义对象的getContextPath()函数。我怎么能这样做?
答案 0 :(得分:6)
问题是代码this.getContextPath()稍后在作为onjax()函数的on选项传递的匿名函数中执行。因此,您想要的'this'(您的自定义JS对象)在执行方法时将无法使用。您可以将其存储在变量中,并将函数“closure”作为引用。以下应该有效:
var calendarViewer = this;
jQuery.ajax({
url: jQuery(formSel).attr("action"),
type: "POST",
data: jQuery(formSel).serialize(),
beforeSend: function(xhr) {
jQuery(msgSel).hide();
jQuery(msgSel).html("");
jQuery(tableSel).hide();
jQuery(pagerSel).hide();
jQuery(cpSelector).block({
message: "<img src='"+calendarViewer.getContextPath()+"/images/icon_loading.gif' align='absmiddle' alt='Loading...' /> Fetching events..."
});
},
答案 1 :(得分:4)
也许可以尝试使用 jQuery(this)
function myCode() {
var th = this;
$.ajax( ... , th.getContextPath() ... );
}
//好吧,它引用了jQuery对象。这是因为你没有使用缩进来指出在 onBeforeSend 中调用代码:(
答案 2 :(得分:1)
您想要哪个对象的getContextPath()
方法?
快速Google搜索仅显示它可供Java使用,而不是Javascript。
答案 3 :(得分:0)
您可以在javascript中使用call在其他功能中将此自定义对象作为此内容发送 例如:
function SecondFunc() {
alert(this.MyVar);
}
function FirstFunc() {
var obj = {MyVar:"Test"}
SecondFunc.call(obj);
}
身体
<input type="button" onclick="FirstFunc()" value="test" />
只需在事件中调用FirstFunc(),它将使用您的自定义执行SecondFunc()。
在你的情况下
function raiseSendRequest()
{
sendRequest.call(YourCustomObject);
}
function sendRequest()
{
jQuery.ajax({
url: jQuery(formSel).attr("action"),
type: "POST",
data: jQuery(formSel).serialize(),
beforeSend: function(xhr) {
jQuery(msgSel).hide();
jQuery(msgSel).html("");
jQuery(tableSel).hide();
jQuery(pagerSel).hide();
jQuery(cpSelector).block({
message: "<img src='"+this.getContextPath()+"/images/icon_loading.gif' align='absmiddle' alt='Loading...' /> Fetching events..."
});
}
希望这有效
答案 4 :(得分:0)
提示:您应该熟悉Javascript中的词法范围
如果您在另一个对象中设置了ajax,那么您可以尝试...
{
//code
var ObjectSelf = this;
//refer to your object via ObjectSelf
}
答案 5 :(得分:0)
这是一个绑定问题。当您在jQuery方法中调用它时,它通常会引用您正在执行任务的DOM或HTML元素。
我会在
推荐一个人jQuery.proxy()
解决了你的问题。