Javascript 使用jqueryclick函数,可以在某些位置执行代码,但不能在其他位置执行代码

Javascript 使用jqueryclick函数,可以在某些位置执行代码,但不能在其他位置执行代码,javascript,jquery,Javascript,Jquery,我可能错过了一些明显的东西,如果是的话,请提前道歉 使用ajax solr并实现他们当前搜索小部件示例/教程的我自己的版本-我有一个代码片段,如下所示: (function($) { AjaxSolr.CurrentSearchWidget = AjaxSolr.AbstractWidget.extend({ start: 0, afterRequest: function() { var self = this; var li

我可能错过了一些明显的东西,如果是的话,请提前道歉

使用ajax solr并实现他们当前搜索小部件示例/教程的我自己的版本-我有一个代码片段,如下所示:

(function($) {
   AjaxSolr.CurrentSearchWidget = AjaxSolr.AbstractWidget.extend({
      start: 0,

      afterRequest: function() {
         var self = this;
         var links = [];

         var q = self.manager.store.get('q').val();
         var qText = q;
         if (q != null && q != '*:*') {
            if (q.split(':').length == 2) {
               qText = q.split(':')[1];
            }
            links.push($('<a href="#" class="cur-search"></a>')
                       .text('search: ' + qText + ' (remove)').click(function() {
               localStorage.removeItem("query");
               localStorage.setItem("query", "*");
               self.manager.store.get('q').val('*:*');
               self.doRequest();
               return false;
            }));
         }

         var fq = self.manager.store.values('fq');
         var prettyText = "";
         for (var i = 0, l = fq.length; i < l; i++) {
              //string manipulation for user-facing text
              links.push($('<a href="#" class="cur-search"></a>')
                         .text(prettyText + ' (remove)').click(self.removeFacet(fq[i])));

             //local storage stuff
           }
           if (links.length > 1) {
              links.unshift($('<a href="#" class="cur-search"></a>')
                            .text('remove all').click(function() {
                 localStorage.clear();
                 localStorage.setItem("query", "*");
                 self.manager.store.get('q').val('*');
                 self.manager.store.remove('fq');
                 self.doRequest();
                 return false;
              }));
           }

           //update DOM
        },
(函数($){
AjaxSolr.CurrentSearchWidget=AjaxSolr.AbstractWidget.extend({
起点:0,
afterRequest:function(){
var self=这个;
var-links=[];
var q=self.manager.store.get('q').val();
var-qText=q;
如果(q!=null&&q!='*:*'){
如果(q.split(“:”).length==2){
qText=q.split(“:”)[1];
}
links.push($('')
.text('搜索:'+qText+'(删除)')。单击(函数(){
localStorage.removietem(“查询”);
setItem(“查询”,“*”);
self.manager.store.get('q').val('*:*');
self.doRequest();
返回false;
}));
}
var fq=self.manager.store.values('fq');
var prettyText=“”;
对于(变量i=0,l=fq.length;i1){
links.unshift($('')
.text(“全部删除”)。单击(函数(){
localStorage.clear();
setItem(“查询”,“*”);
self.manager.store.get('q').val('*');
self.manager.store.remove('fq');
self.doRequest();
返回false;
}));
}
//更新DOM
},
我已经去掉了不必要的代码,但是上面的代码很好用。但是,如果我改变

links.push($('<a href="#" class="cur-search"></a>')
                             .text(prettyText + ' (remove)')
                             .click(self.removeFacet(fq[i])));
links.push($('')
.text(prettyText+'(删除)')
。单击(self.removeFace(fq[i]));
按照上面和下面的示例使用函数,如

links.push($('<a href="#" class="cur-search"></a>')
                             .text(prettyText + ' (remove)')
                             .click(function () {
   self.removeFacet(fq[i]);
}));
links.push($('')
.text(prettyText+'(删除)')
。单击(函数(){
自移除面(fq[i]);
}));

因此,我可以在那里添加其他代码,当单击锚定时,它不再运行RemoveFace。感谢您对我缺少的内容的帮助!

这似乎是函数范围的问题。这不再指向您的对象。我建议像这样绑定您的“self”对象

links.push($('<a href="#" class="cur-search"></a>')
        .text(prettyText + ' (remove)')
        .click(function () {
            var self = this;
            self.removeFacet(fq[i]);
         }).bind(self));
links.push($('')
.text(prettyText+'(删除)')
。单击(函数(){
var self=这个;
自移除面(fq[i]);
}).束缚(自我);

请查看更改此选项是否有效

links.push($('<a href="#" class="cur-search"></a>')
                             .text(prettyText + ' (remove)')
                             .on('click', function () {
   self.removeFacet(fq[i]);
}));
links.push($('')
.text(prettyText+'(删除)')
.on('单击',函数(){
自移除面(fq[i]);
}));

您遇到的问题-您的内部函数(匿名单击函数)不会立即执行,因此迭代器会“丢失”。下面的示例

var i, colors = ['green', 'blue', 'red'];

for (i = 0; i < colors.length; i++) {
    var color = colors[i];
    setTimeout(function() {
        console.log(color);
    }, i * 1000);
}
// red, red, red
vari,colors=[‘绿色’、‘蓝色’、‘红色’];
对于(i=0;i
将记录3次红色,因为函数的代码(在超时内)在循环外执行,迭代器处于其最后位置

使用这个变量,在每次迭代时,值都会被捕获到函数的一个参数中,该参数确实创建了一个作用域,从而产生 输出为绿色、蓝色和红色

var i, colors = ['green', 'blue', 'red'];

for (i = 0; i < colors.length; i++) {
    (function(color) {
        setTimeout(function() {
            console.log(color);
        }, i * 1000);
    })(colors[i]);
}
// green, blue, red 
vari,colors=[‘绿色’、‘蓝色’、‘红色’];
对于(i=0;i
在您的情况下,类似这样的方法应该有效:

links.push($('<a href="#" class="cur-search"></a>')
.text(prettyText + ' (remove)')
.click((function(instance, facet) {
    // your code here
    // and delete
    instance.removeFacet(facet);
})(self, fq[i]));
links.push($('')
.text(prettyText+'(删除)')
.单击((函数(实例、方面){
//你的代码在这里
//删除
实例.removeFacet(facet);
})(self,fq[i]);

在功能上使用总是更好。试试这样的功能

$(window, "a.cur-search", function () {
        var self = this;
        self.removeFacet(fq[i]);
     });

您可能需要将fq[i]在数据中或使其可用的东西中。

不幸的是,这没有什么区别,正如其他人所说,这看起来像是一个范围问题。范围问题是有意义的,但我尝试了您的更改,但removeFacet仍然没有被调用。@KirstyB。您能确认它没有被调用,或者调用时使用了错误的元素吗?你有js错误吗?它根本没有被调用,也没有控制台errors@KirstyB.当你转储实例和方面时,你得到了对象吗?点击方法本身是否执行了?你能提供一种工作代码来查看吗?范围问题很有道理,但不幸的是,我似乎无法让你的更改生效,我只是不断得到一个jQuery“TypeError:m.push不是一个函数”,我似乎无法修复它