Как JQuery может расширить элемент другим, содержащим обработчики событий? - PullRequest
1 голос
/ 20 сентября 2011

Есть ли решение для создания фиктивного элемента с его свойствами, методами и обработчиками событий и расширения существующего элемента с его помощью?Например:

var dummyElement = $('<div />', {
  // properties
  ...
  // methods
  ...
  // event handlers
  ...
});

, а затем,

$.extend( $('#myElement'), dummyElement );

Теперь $ ('# myElement') имеет свойства, методы и обработчики событий dummyElement в дополнение к своим собственным.

Возможно ли это?Как я могу сделать это с JQuery?

Спасибо

Ответы [ 3 ]

0 голосов
/ 20 сентября 2011

Проверьте метод jQuery clone(). В сочетании с replaceWith(), я думаю, вы можете достичь чего-то близкого (но не совсем) того, что вы ищете:

// 1- create dummy
var dummy - $('<div />');

// 2- add stuff to dummy...
// ex: adding a click handler, and an "alt" attribute
dummy.click(function(evt) { console.log("click"); }
dummy.attr("alt", "this is the alt text for dummy");

// 3- clone dummy, and the replace `#myElement` with the clone
$('#myElement').replaceWith( dummy.clone(true) );

Примечание : код, который вы использовали при создании dummyElement в вашем примере, не является допустимой формой функции jQuery. Насколько я знаю, вы не можете добавлять свойства, методы и обработчики, просто передавая их в качестве второго аргумента функции jQuery. Если вы передадите второй аргумент, jQuery будет интерпретировать его как контекст, в котором разрешается селектор. Я показал пример добавления обработчика кликов и атрибута.


Редактировать : Если вы просто пытаетесь скопировать свойства объекта (как вы сказали: "свойства", "методы" и "обработчики событий") из одного элемента HTML в другой, тогда $.extend(...) это инструмент для работы. Просто убедитесь, что вы работаете с самими элементами HTML, а не с объектами набора Jquery. Это будет выглядеть примерно так:

var dummy = $('<div />');
var myElement = $('#myElement');
$.extend(myElement.get(0), dummy.get(0));
0 голосов
/ 20 сентября 2011

Хорошо. Благодаря различным ответам, в частности, от Lee . Кажется, что метод $.extend(...) jQuery не предназначен для расширения элемента DOM от другого. Но он может расширить элемент DOM из объекта. Вот решение, чтобы сделать это:

1) Сначала я создаю объекты расширения. Каждое из этих расширений должно иметь определенный метод initExtension(). Вот пример для создания двух расширенных объектов:

var myObjExtension1 = {
  // constructor
  initExtension : function() {
    // Add some data properties
    this.something = 'something';

    // Add some method properties
    this.doSomething = function() { alert(this.something); };

    // Add some DOM elements
    $(this).append('<div>element created from extension 1</div>');  

    // Add some event handlers
    $(this).click(
      function(evt) {
        $(this).append('<div>element created from extension 1 click event</div>');
      }
    );
  }
};

var myObjExtension2 = {
  // constructor
  initExtension : function() {
    // Add some data properties
    this.more = 'more';

    // Add some method properties
    this.doMore = function() { alert(this.more); };

    // Add some DOM elements
    $(this).append('<div>element created from extension 2</div>');  

    // Add some event handlers
    $(this).click(
      function(evt) {
        $(this).append('<div>element created from extension 2 click event</div>');
      }
    );
  }
};

2) Чтобы легко расширить все элементы, которые мне нужны, я создал небольшой плагин jQuery. Этот плагин содержит один метод, расширяющий исходный элемент указанным расширением:

(function($){
  $.fn.extendWith = function( objExtension ) {
    this.each( 
      function(index) {
        $.extend( this, objExtension );
        this.initExtension();
      }
    );
    return this; // jQuery chaining
  }
})(jQuery);

3) Наконец, я расширяю некоторые элементы jQuery. Обратите внимание, что в следующем примере я расширяю элементы, которые соответствуют классу someElement, сначала с помощью myObjExtension1, а затем с myObjExtension2, с помощью цепочки метода плагина extendWith(...):

$('.someElement').extendWith( myObjExtension1 ).extendWith( myObjExtension2 );

Теперь все свойства данных myObjExtension1 и myObjExtension2, свойства методов и обработчики событий доступны из моих элементов $ ('. SomeElement'). Пример: * +1022 *

$('.someElement').each( function() {
  this.doSomething();
  this.doMore();
});
0 голосов
/ 20 сентября 2011

IMO вам не нужен фиктивный элемент вообще.В следующем примере я демонстрирую простой способ создания элемента в чистом javascript.

Исходный код

createElement: function (options) {
    /// <summary>Creates a document object model (DOM) element.</summary>
    /// <param name="options" type="Object">An object that contains tag name, attributes, events, properties and children.</param>

    var clone = this.extend({}, options);

    // Create element
    var e = document.createElement(clone.tag);
    delete clone.tag;

    // Assign attributes
    if (clone.attributes) {

        for (var attrib in clone.attributes) {
            e.setAttribute(attrib.replace('$', ''), clone.attributes[attrib]);
        }

        delete clone.attributes;
    }

    // Create and append children if has
    if (clone.children) {

        for (var idx in clone.children) {
            e.appendChild(this.createElement(clone.children[idx]));
        }

        delete clone.children;
    }

    // Assign event handlers
    if (clone.events) {

        for (var en in clone.events) {

            var handler = clone.events[en];

            if (handler instanceof Function)
                this.addHandler(e, en, handler);
        }

        delete clone.events
    }

    // Assign properties
    for (var prop in clone) {
        e[prop] = clone[prop];
    }

    return e;

},

addHandler: function (element, eventName, handler) {

    // Firefox is first, Of cource after chrome :p
    if (element.addEventListener) {
        element.addEventListener(eventName, handler, false);
    }
    else if (element.attachEvent) {
        element.attachEvent('on' + eventName, handler);
    }

},

extend: function (expando, properties, override) {

    if (properties && typeof (properties) == 'object') {

        for (var prop in properties) {

            var val = properties[prop];

            if (!expando[prop] || override)
                expando[prop] = val;

        }

    }

    return expando;

}

Вы можете переписать приведенный выше код с помощью jQuery, чтобы расширить вашэлемент, вместо создания нового.

Использование

Util.createElement({
    tag: 'input',
    type: 'checkbox',
    checked: this.checked,
    events: {
        change: function(e) { // ... }
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...