style que change attribute javascript jquery custom-data-attribute

que - Pasa la función javascript como atributo de datos*y ejecuta



title css (5)

Conocemos las sintaxis que se describen a continuación, al definir un value para el atributo onClick :

<button type="submit" onclick="alert(''hi'');"></button> <button type="submit" onclick="doWork"></button> <!-- This one doesn''t work --> <button type="submit" onclick="doWork()"></button> <button type="submit" onclick="doWork(''Mike'', 2)"></button>

Lo que me interesa es definir un data-attribute personalizado y ejecutar el valor de la siguiente manera:

<button type="submit" data-callback="alert(''hi'');" class="marker"></button> <button type="submit" data-callback="doWork" class="marker"></button> <button type="submit" data-callback="doWork()" class="marker"></button> <button type="submit" data-callback="doWork(''Mike'', 2)" class="marker"></button> <script type="text/javascript"> jQuery("body").on("click","button.marker", function(e) { var callback = jQuery(e.currentTarget).data("callback"); // Now I need to execute the callback no matter of the format // 1. Execute as function''s body // 2. Or by function ''name'' // 3. Or by function ''name'' with 0 parameters // 4. Or by function ''name'' with n parameters }) function doWork(name, nr){ var personName = name || "Unnamed"; var personNr = nr || 0; alert("Name is: " + personName + " Nr: " + personNr); } </script>

He pegado la muestra a jsBin

¿Cómo lograr el mismo comportamiento utilizando atributos de datos personalizados?


Creo que una mejor idea sería vincular dinámicamente los eventos y desencadenarlos. Si quisiera que solo fueran conocidos por otro código, podría usar eventos personalizados.

<button type="submit" class="marker marker1"></button> <button type="submit" class="marker marker2"></button> <button type="submit" class="marker marker3"></button> <button type="submit" class="marker marker4"></button> <script> var $markers = $(''.marker''); $markers.filter(''.marker1'').bind(''customCallback'', function(){ alert("hi"); }); $markers.filter(''.marker2'').bind(''customCallback'', function(){ doWork(); }); </script>

Luego, sus otros componentes podrían invocarlos con $ (selector) .trigger (''customCallback'');


Si realmente quisieras pasar funciones (con o sin parámetros) de una cosa a otra sin vincularlas como eventos, podrías hacerlo de esta manera (comencé desde la respuesta de @ Taplar)

<button type="submit" class="marker marker1"></button> <button type="submit" class="marker marker2"></button> <button type="submit" class="marker marker3"></button> <button type="submit" class="marker marker4"></button> <script> var $markers = $(''.marker''); $markers.filter(''.marker1'').get(0).customCallback = doWork; $markers.filter(''.marker2'').get(0).customCallback = function(){ doWork(arg0,arg1); }; </script>

Luego puedes acceder a ellos en tu otro componente como:

<script> $(''.marker'').each(function(){ var thisFunction = $(this).get(0).customCallback; //do something useful with thisFunction }); </script>


Simplemente con:

$("body").on("click","button.marker", function(e) { eval($(this).data("callback")); })


Simplemente puede enlazar una función como un atributo de datos

const ele = $(''button''); ele.data(''onClick'', evt => { alert(''bye''); }) ele.click(evt => { const ele = $(evt.target); ele.data(''onClick'')(evt); })


Una forma es usar eval()

jQuery(".container").on("click", "button.marker", function (e) { var callback = jQuery(e.currentTarget).data("callback"); var x = eval(callback) if (typeof x == ''function'') { x() } });

Demo: Fiddle

Nota: asegúrese de que sea seguro en su entorno, es decir, no hay posibilidad de inyección de guiones debido a la mala entrada de los usuarios