2013-08-25 3 views
0

Что я имею, как бы необычно, я думаю. У меня есть эта функция deleteItem которая запускается OnClick и имеет следующие параметрыПередайте объект html через строку в функцию

function dItem(type,id,element,confirmed){ 
    if(confirmed){ 
     handle delete function 
    }else{ 
     var c = ','; 
     popup('Are you sure you want to delete this item?', 
      { 
       "Yes":"dItem('"+type+"'"+c+id+c+element+c+true+")", 
       "Cancel":"popupClose()" 
      } 
     ) 
    } 
} 

.. onclick='dItem("comment",15,this,false)' ..

Во втором параметре popup() «s передаются кнопки, которые будут отображаться во всплывающем окне и функции, которые они называют соответственно , Проблема в том, что element - это HTMLDIV element, и я не могу понять, какой способ передать это через строку. Единственное решение, о котором я мог подумать, - это иметь глобальную переменную, содержащую данный элемент и не передавать его вообще, хотя я действительно не хочу этого делать, поскольку это скорее хак, а не решение. Кто-нибудь знает, как я могу передать этот элемент через строку? Заранее спасибо!

EDIT:

Это как объект кнопки b обрабатывается и превращается в HTML. Вы видите, как я могу предоставить ему фактическую функцию вместо имени в виде строки?

var _b = ''; 
for(var i in b){ 
    _b+="<div onclick='"+b[i]+"'>"+i+"</div>"; 
} 
+0

Может не пройти элемент DOM, но передать идентификатор элемента и использовать document.getElementById –

+0

Что в настоящее время происходит, когда вы запустите код, хотя? Я не вижу причины, по которой ваш код не работает:/В отличие от прохода всего элемента, почему бы вам не передать его идентификатор? – ninty9notout

+0

Поскольку элемент не имеет идентификатора. К сожалению, мне кажется, что нужно взломать это единственный способ. –

ответ

2

Это чаще встречается с обратными вызовами. Для этого вам нужно будет изменить свою функцию всплывания.

Пример:

popup('Are you sure you want to delete this item?', { 
    "Yes": function() { 
     dItem(type, id, element, confirmed); 
    }, 

    "Cancel": function() { 
     popupClose(); 
    } 
}); 

В качестве временного решения можно просто создать уникальный идентификатор для элемента и использовать его для идентификации элемента в дальнейшем. Поскольку ваша функция рекурсивна, вам нужно иметь дело с тем фактом, что element может быть либо ELEMENT_NODE, либо string.

for(var i in b){ 
    var generatedId = i /* TODO: not sure this generates an unique id */; 
    _b += "<div id='" + generatedId + "' onclick='" + b[i] + "'>" + i + "</div>"; 
} 

function dItem (type, id, element, confirmed) { 
    if (confirmed) { 
     // handle delete function 
    }else{ 
     var elementId; 

     // find the elementId 
     if (element && element.nodeType && element.nodeType == 1) { 
      elementId = element.id; 
     }else if (typeof element == 'string') { 
      elementId = element 
     }else{ 
      throw Error('Argument [element] is not a ELEMENT_NODE or string'); 
     } 

     var args = [type, id, elementId, true]; 

     popup('Are you sure you want to delete this item?', { 
      "Yes": "dItem(" + args.join(', ') + ")", 
      "Cancel": "popupClose()" 
     }); 
    } 
} 
+0

Это приятное предложение, но я не могу этого сделать, потому что html из объекта кнопок создается таким образом, что я могу передавать только функции через строки. Необходимость перестроить всю функцию и исправить ее сотни применений по всему проекту - это то, чего я действительно хотел бы избежать. Жаль, что я не думал об этом к моменту создания этой функции. + rep –

+0

Единственный способ, с которым я могу думать, помимо обратных вызовов - передать атрибут id элемента вместо фактического элемента. – Bart

+0

Я отредактировал вопрос, вы можете проверить его? –