在jQuery函数中使用“this”

时间:2010-07-29 20:17:44

标签: jquery this jquery-blockui

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

6 个答案:

答案 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)

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

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()

解决了你的问题。