2012-10-16 5 views
10

Sto scrivendo un plugin jquery per creare chiamate ajax progettate per la mia app.jQuery rileva automaticamente se ho bisogno di usare .html() o .val()

All'interno di questo plug-in, la mia chiamata ajax si presenta così (ridotto a quello che la necessità domanda):

$.ajax({ 
     url: route, 
     type: "post", 
     data: inputData, 
     success: function(response, textStatus, jqXHR) { 
      if (outputSelector !== undefined) { 

       $(outputSelector).html(response); 
       // or 
       $(outputSelector).val(response); 

      } 
     } 
    }); 

outputSelector è un selettore, definita al di fuori del plugin. Non so se questo selettore è un <div> o un <input> o anche uno <select>. C'è un modo intelligente per sapere se ho bisogno di usare val() o html()?

+2

Can tua selettore essere arbitrario, ad es '" div, input, selezionare "'? –

+0

sì, potrebbe essere –

+0

qual è la struttura della risposta che ottieni? puoi darci un esempio? – svillamayor

risposta

12

Forse abbiamo potuto verificare se l'elemento ha value proprietà:

var el = $(outputSelector); 
if (el[0].value !== undefined) { 
    el.val(response); 
} else { 
    el.html(response); 
} 

Così, un po 'come una linea di soluzione universale potrebbe essere:

$(outputSelector).each(function() { 
    this[this.value !== undefined ? "value" : "innerHTML"] = response; 
}); 
+0

questa soluzione sarebbe più facile da mantenere, quindi potenzialmente aggiornando i selettori di switch oi selettori '.is()' in fondo alla strada. Unica cosa da notare, è che se possiedi potenzialmente un selettore che Álvaro menziona nei commenti ('" div, input, select "') potresti aver bisogno di '.split()' nella virgola e controllare ogni elemento singolarmente. – kmfk

+0

Il tuo modo funziona molto bene, [jsfiddle] (http://jsfiddle.net/HCCsD/). Grazie. In un '$ .each()' Sarò in grado di gestire selezioni multiple. –

+1

@Ninsuo In caso di molti elementi di output, è possibile utilizzare '$ (outputSelector) .each (function() {if (this.value! == undefined) {...}});', proprio come [xdazz] (http://stackoverflow.com/a/12919512/1249581) proposto. – VisioN

2

È possibile utilizzare il metodo .is(..) per determinare quale metodo usare.

$.ajax({ 
    url: route, 
    type: "post", 
    data: inputData, 
    success: function(response, textStatus, jqXHR) { 
     if (outputSelector !== undefined) { 
      var $output = $(outputSelector), 
       method = $output.is('input,select,textarea') ? 'val' : 'html'; 

      $output[method](response); 
     } 
    } 
}); 
0

All'interno della vostra funzione di successo, mettere:

if (outputSelector !== undefined) { 
    if(outputSelector.is("input")) 
    { 
     outputSelector.val(response); 
    } 
    else if (outputSelector.is("div")) 
    { 
     outputSelector.html(response); 
    } 
} 

sarebbe sintassi meglio utilizzare un'istruzione switch, ma se si assume solo ingresso sarà utilizzato per val(), e tutto il resto è html() poi basta sostituire l'ultimo else if con solo else e rimuovere il condizionale.

4

Se il outputSelector è un selettore di classe e gli elementi sono tipi misti, è necessario utilizzare .each. Sebbene non sia corretto mischiare div e input con la stessa classe, ma se si sta creando un plug-in, è necessario considerare tale caso.

$(outputSelector).each(function() { 
    if ('value' in this) { 
     $(this).val(response); 
    } else { 
     $(this).html(response); 
    } 
}); 
1

si potrebbe anche utilizzare il metodo .prop() per determinare se una proprietà viene definita per un dato selettore:

if ($(outputSelector).prop("value") !== undefined) 
    $(outputSelector).val(response); 
else 
    $(outputSelector).html(response); 

EXAMPLE

In alternativa si potrebbe ci .hasOwnProperty()