Как я получаю разметку элемента, включая себя с помощью jQuery?

Для тех из нас, кому нужно смоделировать исключение и не может сделать это простым исправлением head, вот простое решение, которое заменяет целевое исключение пустым:

Скажем, у нас есть универсальный модуль для тестирования с исключением, который мы должны смоделировать:

# app/foo_file.py
def test_me():
    try:
       foo()
       return "No foo error happened"
    except CustomError:  # <-- Mock me!
        return "The foo error was caught"

Мы хотим смоделировать CustomError, но поскольку это исключение, мы сталкиваемся с проблемами, если пытаемся исправить его, как и все остальное. Обычно вызов patch заменяет цель на MagicMock, но здесь это не сработает. Насмешки изящны, но они ведут себя не так, как исключения. Вместо того, чтобы патчить с макетом, давайте вместо этого сделаем исключение для заглушки. Мы сделаем это в нашем тестовом файле.

# app/test_foo_file.py
from mock import patch


# A do-nothing exception we are going to replace CustomError with
class StubException(Exception):
    pass


# Now apply it to our test
@patch('app.foo_file.foo')
@patch('app.foo_file.CustomError', new_callable=lambda: StubException)
def test_foo(stub_exception, mock_foo):
    mock_foo.side_effect = stub_exception("Stub")  # Raise our stub to be caught by CustomError
    assert test_me() == "The error was caught"

# Success!

Так что с lambda? Параметр new_callable вызывает все, что мы ему даем, и заменяет цель возвращением этого вызова. Если мы передадим наш класс StubException прямо, он вызовет конструктор класса и исправит наш целевой объект с исключением instance , а не class , что не то, что мы хотим. Обернув его в lambda, он возвращает наш класс, как мы и собирались.

Как только наше исправление выполнено, объект stub_exception (который буквально является нашим классом StubException) может быть поднят и пойман, как если бы это был CustomError. Ухоженная!

6
задан Justin Lee 12 June 2009 в 16:25
поделиться

5 ответов

Насколько мне известно, в jQuery нет поддержки "externalHTML", но вы можете написать функцию для его эмуляции (в браузерах, отличных от IE), или использовать this plugin :

// this will return the element and it's mark-up, of an element
// with the id myTag
var outer = $('#myTag').outerHTML();

Очевидно, реализация Брэндона - не единственная ... Я уверен, что вы могли бы придумать и другие умные реализации ..

EDIT

Если вы хотите избежать вызовов добавления , может быть, вы могли бы попробовать что-то вроде этого ...

function getOuterHTML(el)
{   
    var wrapper = '';

    if(el)
    {
        var inner = el.innerHTML;
        var wrapper = '<' + el.tagName;

        for( var i = 0; i < el.attributes.length; i++ )
        {
            wrapper += ' ' + el.attributes[i].nodeName + '="';
            wrapper += el.attributes[i].nodeValue + '"';
        }
        wrapper += '>' + inner + '</' + el.tagName + '>';
    }
    return wrapper;
}


// now, to replicate the sample above
var outer = getOuterHTML($('#myTag'));

Единственное, что я не уверен, все ли браузеры поддерживают массив атрибутов ... но я знаю, что есть у семейства Mozilla, а IE имеет встроенную поддержку externalHTML. . попробуйте (для тех, кто не поддерживает массив атрибутов, вы можете использовать предыдущий метод, который использует добавления)

9
ответ дан 8 December 2019 в 03:11
поделиться

Это будет хорошо работать:

jQuery.fn.outer = function() {
    return $($('<div></div>').html(this.clone())).html();
} 
15
ответ дан 8 December 2019 в 03:11
поделиться

Хм, вам не нужно использовать плагин, я уверен, что вы можете попробовать

// this uses the jquery selectors, then returns the DOM element, 
// which then u can use the standard outterHTML...
$('#myelement').get(0).outerHTML;

Изменить: если ваши селекторы jquery соответствуют более чем одному элементу, вы можете пройти через них, обратитесь к документации jquery для примеры

4
ответ дан 8 December 2019 в 03:11
поделиться

Это сообщение в блоге может вам помочь.

Он описывает метод, который выглядит следующим образом:

var html = $('<div>').append($('#top').clone()).remove().html()

Это клонирует интересующий div, добавляет его к div-оболочке и затем получает html-код оболочки - который приравнивается к исходному html первого div.

Его предложение просто окружить его изначально объявленным div-оболочкой кажется лучшим вариантом. Тогда вам не придется заморачиваться со всем этим.

2
ответ дан 8 December 2019 в 03:11
поделиться

Без какого-либо кода выберите элемент, выберите первый внутренний элемент, получите его родительский элемент (тот, который вам нужен), а затем оберните его вокруг исходного выделения из youElement.html ().

0
ответ дан 8 December 2019 в 03:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: