Qualtrics API函数在EventListener中调用的自定义函数中不起作用

时间:2018-09-19 00:20:39

标签: javascript javascript-events onblur qualtrics

我在标题部分定义了一个自定义函数,该函数可以检查,提醒用户并在特定限制失败时重置特定滑块的值。

在点击问题时,此功能可以很好地发挥作用:

  this.questionclick = chkVals;

我还希望在用户退出文本输入字段时运行该功能(因为某些用户正在使用键盘进行调查)。我为每个滑块的文本输入字段实现了一个事件侦听器,当焦点不在文本输入字段中时,该事件监听器将运行该函数。

// choices is an array of choice ids 
  for (i = 0; i < choices.length; i++) {
    var x = document.getElementById(choices[i]);
    x.addEventListener("blur", chkVals, true);
  };

我知道事件侦听器有效,因为弹出了正确的警报。由于this.setChoiceValue不是环境中的功能,因此无法重置这些值。我尝试在函数中设置var that = this;并调用that.setChoiceValue,但仍然无法正常工作。

任何帮助将不胜感激!非常感谢。

2 个答案:

答案 0 :(得分:1)

您还没有显示所有代码,所以我做一些假设。

this是addOnload函数中的Qualtrics问题对象。由于chkVals在addOnload函数之外,因此this(或that)是未定义的。因此,您需要在函数调用(function chkVals(qobj)中传递它,然后在chkVals函数中使用qobj.setChoiceValue。然后您的函数调用将变为:

this.questionClick = chkVals(this);

x.addEventListener("blur", chkVals(this), true);

答案 1 :(得分:1)

@T。 Gibbons的回答帮助我达到了这一点。如建议的那样,我需要向<?xml version="1.0" encoding="utf-8"?> <android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/cardView_item_assesment" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="4dp" android:clickable="true" android:focusable="true" app:cardCornerRadius="4dp" app:cardElevation="4dp" > <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:id="@+id/textView_title" android:layout_width="285dp" android:layout_height="wrap_content" android:layout_marginBottom="5dp" android:layout_marginEnd="5dp" android:layout_marginLeft="5dp" android:layout_marginRight="5dp" android:layout_marginStart="5dp" android:layout_marginTop="5dp" android:ellipsize="end" android:maxLines="1" android:scrollHorizontally="true" android:textColor="@color/colorPrimaryDark" android:textSize="30sp" tools:text="PlaceHolder" /> <TextView android:id="@+id/textView_date" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentEnd="true" android:textColor="@color/colorPrimaryDark" android:textSize="15sp" android:layout_margin="5dp" tools:text="2018/09/02" /> <TextView android:id="@+id/textView_time" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/textView_date" android:layout_alignParentEnd="true" android:textColor="@color/colorPrimaryDark" android:textSize="15sp" android:layout_margin="5dp" tools:text="09:00" /> <TextView android:id="@+id/textView_total" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toEndOf="@id/editText_achieved" android:layout_below="@+id/textView_title" android:textColor="@color/colorPrimaryDark" android:layout_alignBaseline="@id/editText_achieved" android:textSize="20sp" android:layout_margin="5dp" tools:text="Total: 100" /> <android.support.v7.widget.AppCompatEditText android:id="@+id/editText_achieved" android:layout_width="130dp" android:layout_height="wrap_content" android:layout_below="@+id/textView_title" android:maxLines="1" android:textColor="@color/colorPrimaryDark" android:textSize="20sp" tools:text="Result: 50" /> <TextView android:id="@+id/textView_contribution" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/textView_total" android:textColor="@color/colorPrimaryDark" android:textSize="20sp" android:layout_margin="5dp" tools:text="Weight: 25%"/> <TextView android:id="@+id/txtID" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="invisible" /> </RelativeLayout> 添加一个参数,以便能够引用chkVals()对象。但是,

this

由于this.questionClick = chkVals(this); 是保留对象而无法工作,因此整个标题脚本将无法运行。我最终在我的自定义函数中将this的所有引用更改为this,并根据建议添加了参数that

that

要使用参数调用该函数,必须显式定义一个名为function chkVals(that) { ... ... that.setChoiceValue(x, y) } 的匿名函数,否则它将不起作用(我不确定为什么):

chkVals

以上有效!