2016-04-25 5 views
0

Ich habe ein HTML-Raster mit variabler Anzahl von Zeilen, die einen Datumsauswahl in der ersten Spalte & eine HTML-Schaltfläche in der dritten Spalte hat.Zugriff auf Elementattribute nach dem Übergeben der Referenz jQuery

Ich brauche die Referenz der Schaltfläche & übergeben Sie es in Funktionen (möglicherweise mehr als einmal), um seinen Klick oder Zugriff auf sein Attribut an verschiedenen Orten aufrufen.

var myButton = $(this).parents('tr').find('input[type=button]'); // accesing the button in a function 

weiter ich vorbei diese Variable in einem Objekt zu einer anderen JS-Funktion doSomething

doSomething.call(this, { 'btnRef': myButton[0] }, condition); 

Innerhalb der doSmething Funktion, die ich in einem globalen JS Objekt diese Referenz speicherte

unsavedObj['btnRef'] = arguments[0]['btnRef']; // I also tried jQuery(arguments[0]['btnRef']) 

Problem tritt auf, nachdem ich versuche, über das globale Objekt

auf ein Attribut zuzugreifen

Ich kann auf Attribute usw. innerhalb der Funktion korrekt zugreifen, wo var myButton den Wert auch erhält jQuery(arguments[0]['btnRef'].attr('rel')) gibt das richtige Ergebnis zurück. Ist dies das Problem aufgrund des Kontexts ?.

Beispielcode:

//this is the datepicker handler which fires on select of a date. 


    onSelect: function(d,i) { 
        var condition = false; 
         var myButton = $(this).closest('tr').find('input[type=button]');     
         var btnRel = myButton.attr('rel'); 
        //some other vars 

        myButton.prop("disabled", false); //this works fine 

        if(jQuery(myButton).hasClass('xyz')){  
         if(changedFor !=''){      
          if(changedFor == btnRel){ 
          condition = (changedFor == btnRel); 
          } 
         }    
         doSomething.call(this,{'btnRef':myButton},condition);//passing to the function doSomething 
        }   
        } 


//doSomething function. 
function doSomething(){   
        var thisObj = jQuery(this)    
        if(arguments[1]){ 
          unsavedObj['btnRef'].triggerHandler('click',{'check':arguments[1]});   
        }else{ 
          BootstrapDialog.show({ //this is a bootstrap dialogbox 
           title:'', 
            message:function(dialog){ 
              var $content = "Are you sure?"; 
               return '<div>' + $content + '</div>'; 
             }, 
            closable: false, 
            buttons: [{ 
             label:'Change', 
             cssClass: 'btn', 
             action: function(dialogItself){ 
              unsavedObj['btnRef'] = arguments[0]['btnRef']; 
              unsavedObj['context'] = thisObj; 
              changedFor     = unsavedObj['btnRef'].attr('rel'); //does not work  
              unsavedObj['btnRef'].click();  //does not work   
               dialogItself.close(); 
             } 
            },{ 
             label:'Cancel', 
             cssClass:'btn', 
             action: function(dialogItself){ 
              dialogItself.close(); 
             } 
            }] 
           }); 
        } 
      }   

Im sorry für die schlechte Formatierung.

Danke.

+0

Warum mischen Sie reines Javascript und jQuery? Einmal haben Sie begonnen, jQuery zu verwenden, um Kopfschmerzen loszuwerden. – vaso123

+0

Können Sie bitte den vollständigen ** Beispielcode ** angeben? – Justinas

+1

Löst das das Problem: '$ (unsavedObj ['btnRef']) .attr ('rel ')' Ich glaube, dass wenn Sie 'myButton [0]' verwenden, ist es nicht mehr ein jQuery-Objekt, so dass Sie nicht können Verwenden Sie später '.attr '. Sie müssen es in ein jQuery-Objekt zurückkonvertieren. Aber was du machst, könnte meiner Meinung nach viel vereinfacht werden, wenn du mehr Code postest. –

Antwort

0

Entschuldigung dieses Problem geschah wegen der Beschränkung der Verschlüsse auf das arguments Objekt der äußeren Funktion & hier Bootstrap.show({..'s Knopfdefinition war eigentlich eine Schließung. Es wurde behoben, indem eine Kopie von arguments erstellt wurde.

Vielen Dank.

2

ändern

var myButton = $(this).parents('tr').find('input[type=button]'); 

zu

var myButton = $(this).closest('tr').find('input[type=button]'); 

dann ändern

doSomething.call(this, { 'btnRef': myButton[0] }, condition); 

zu

doSomething.call(this, { 'btnRef': myButton }, condition); 

Nun erstellen Sie ein Array von jQuery-Objekten und nicht ein Array von HTML-Objekten, sodass die Funktion .attr (...) funktionieren sollte.

EDIT: Ich vermute, es gibt mehrere Probleme bei der Arbeit hier. Da Sie gesagt haben, dass das obige nicht funktioniert, schauen wir uns doSomething.call (...) an. Hier finden Sie https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call für die Dokumentation. Beachten Sie, dass dies kein jQueryable $ (this) ist, sondern ein Verweis auf die Argumente, die Sie in der aufrufenden Anweisung übergeben haben.

Frage 1: Wird doSomething anderswo aufgerufen? Wenn nicht, dann können mehr explizit die Signatur ein wenig bauen und es nur eine konventionellere Function Call anrufen:

function doSomething(varA, varB, ...){ } 

und

doSomething(....actual passed variables...) 

Lässt dort starten und sehen, wie wir es tun.

+0

Wenn HTML-Objekte dann mit' jQuery' umhüllen –

+0

Sie können das tun, wenn Sie es wieder in jQuery mit $ (htmlObj). – nurdyguy

+0

Sorry, musste zu einer Besprechung laufen und konnte meinen Gedanken nicht beenden ... Sie können das HTML-Objekt zurück in zu ein jQuery-Objekt, aber bedenken Sie, dass dies bedeutet, dass Sie das DOM reparieren.Warum das, wenn Sie es einfach als jQuery speichern können? Wenn es keinen bestimmten Grund gibt, das html-Objekt zu wollen, lassen Sie es als jQuery Objekt – nurdyguy

Verwandte Themen