Rails - ERB sta ignorando JS / jQuery
-
26-10-2019 - |
Domanda
Ho il seguente codice qui sotto, a mio avviso:
<script type="text/javascript">
$(document).ready(function(){
$("#button").click(function(event){
if(false) { //even with if (false), this code is still being executed!
<% if obj %>
<% my_method(obj) %>
<% end %>
$("#button").attr("href","/" + obj.my_path);
}
});
});
</script>
Come si può vedere dal commento, la condizione per il JavaScript if è falsa, in modo che il blocco non dovrebbe mai essere eseguito. Eppure, per qualche ragione, è come il mio JS non esiste e il blocco ERB viene chiamato. Perché sta succedendo? JS sembra funzionare bene su altre pagine del sito.
Se avete bisogno di più informazioni su questo per aiutare a risolvere il problema chiedere via e cercherò di fornire quante più informazioni possibile.
Soluzione
ti sembra di essere un po 'confuso circa la differenza tra lato server e il codice lato client.
L'ERB viene eseguito sul server, il JavaScript sul client. Quando è in esecuzione il tuo ERB, Ruby vede praticamente questa:
puts '<script type="text/javascript">'
puts ' $(document).ready(function(){'
puts ' $("#button").click(function(event){'
puts ' if(false) {'
if obj
my_method(obj)
end
puts ' $("#button").attr("href","/" + obj.my_path);'
puts ' }'
puts ' });'
puts ' });'
puts '</script>'
Semplificando un po 'di più, l'ERB si riduce a qualcosa di simile:
puts some_strings[0]
puts some_strings[1]
puts some_strings[2]
puts some_strings[3]
if obj
my_method(obj)
end
puts some_strings[4]
puts some_strings[5]
puts some_strings[6]
puts some_strings[7]
puts some_strings[8]
Quando si scartare i ERB, diventa abbastanza evidente il motivo per cui è in esecuzione my_method(obj)
.
In ERB terra, tutto il tuo JavaScript è solo un mucchio di stringhe non interpretati:. Il tuo JavaScript è solo un mucchio di testo senza senso fino a quando si arriva al browser del client
Quindi, il browser vedrà qualcosa di simile:
<script type="text/javascript">
$(document).ready(function(){
$("#button").click(function(event){
if(false) {
$("#button").attr("href","/" + obj.my_path);
}
});
});
</script>
Il tuo ERB è nulla da vedere, perché è stata gestita sul server. Ma, il vostro if(false)
è visto e sarà interpretato dal cliente. Tuttavia, l'ERB ha già eseguito in modo che il if(false)
non può influenzare la my_method(obj)
Rubino chiamata.
Altri suggerimenti
Il codice di ERB è Rubino il codice, non si sa nulla di Javascript e il caso è solo markup per esso. Se non si desidera avere il codice ERB correzione eseguito il caso all'interno del codice erb, non sul JavaScript.