1

我创建了一个 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() 函数。我怎样才能做到这一点?

4

6 回答 6

6

问题是代码 this.getContextPath() 稍后在作为选项传递给 ajax() 函数的匿名函数中执行。因此,在执行方法时,您想要的“this”(您的自定义 JS 对象)将不可用。您可以将其存储在一个变量中,并让函数“关闭”引用。以下应该有效:

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..."
  });
},
于 2010-07-29T20:31:01.120 回答
4

也许尝试使用jQuery(this)

看来我误会了你。在给定的示例中,上下文可能导致“this”引用 jQuery 对象。尝试以下技巧:

function myCode() {
 var th = this;
 $.ajax( ... , th.getContextPath() ... );
}

// 好吧,它确实引用了 jQuery 对象。这是因为您不使用缩进来指出代码在onBeforeSend中被调用:(

于 2010-07-29T20:21:23.040 回答
1

你想要getContextPath()来自哪个对象的方法?

快速的 Google 搜索仅显示它可用于 Java,而不是 Javascript。

于 2010-07-29T20:26:32.127 回答
0

您可以通过在 javascript 中使用call
在其他函数中将自定义对象作为 this 发送, 例如:

function SecondFunc() {
    alert(this.MyVar);
}
function FirstFunc() {
    var obj = {MyVar:"Test"}
    SecondFunc.call(obj);
}

在体内

<input type="button" onclick="FirstFunc()" value="test" />

只需在事件中调用 FirstFunc(),它将使用您的自定义 this 执行 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..."
  });
}


希望这有效

于 2010-07-29T20:50:21.497 回答
0

提示:您应该熟悉 Javascript 中的词法作用域

如果您在另一个对象中设置了 ajax,那么您可以尝试...

{
  //code
  var ObjectSelf = this;

  //refer to your object via ObjectSelf

}
于 2010-07-29T20:56:20.873 回答
0

这是一个绑定问题。当您在 jQuery 方法中调用它时,它通常引用您正在执行任务的 DOM 或 HTML 元素。

我会推荐一个 lok

jQuery.proxy()

这解决了你的问题。

于 2010-07-29T21:16:42.830 回答