Как решить дублирование объектов на странице динамической загрузки с помощью jQuery?
Я хочу решить дублировать объекты в динамическом загружаемом содержимом. Для облегчения понимания ознакомьтесь со следующим исходным кодом.
Базовая страница HTML с 1 динамическим загрузкой содержимого
<body>
<div id="general-div"></div>>
<div id="div1"></div>
<div id="placeholder1">
Dynamic Content will be placed inside this.
<div class="inner-div"></div>
<div class="div1"></div>
</div>
</body>
Для script в заголовке этой страницы очень легко выбрать объект "general-div", например, следующий код.
$('#general-div')
Это довольно легко для выбора объекта "внутренний-div" внутри placeholder1. Поэтому я могу выбрать, используя приведенный ниже код.
$('.inner-div')
Вышеприведенный код может работать отлично. Однако я не могу использовать вышеуказанный код, если в том же документе, как и в следующем HTML, имеется более одного дублированного объекта. Вышеприведенный код вернет 2 объекта, которые не нужны мне.
Базовая страница HTML - после загрузки другого динамического загружаемого содержимого
<body>
<div id="general-div"></div>>
<div id="div1"></div>
<div id="placeholder1">
Dynamic Content will be placed inside this.
<div class="inner-div"></div>
<div class="div1"></div>
</div>
<div id="placeholder2">
Dynamic Content will be placed inside this.
<div class="inner-div"></div>
<div class="div1"></div>
</div>
</body>
Возможное решение 1
Я должен создать указанный объект jQuery foreach script в динамическом загружаемом содержимом, таком как следующий код.
// Deep copy for jQuery object.
var specfiedjQueryObj = $.extend(true, {}, jQuery);
// modify find function in jQuery object.
specfiedjQueryObj.fn.find = function(selector)
{
// by adding placeholder selector before eval result.
return new specfiedjQueryObj.fn.old_find('#placeholder1 ' + selector);
};
// So, I can select any object in dynamic loading content.
(function($)
{
// This result must be 1 object.
$('.div1');
})(temp);
Хотя это решение должно работать отлично. Но я обнаружил, что jQuery - очень сложный объект. Я обнаружил много ошибок, когда я пытаюсь их использовать.
Есть ли у вас идея решить эту проблему?
PS. Идентификатор PlaceHolder не является фиксированным идентификатором. Таким образом, невозможно установить его в правиле выбора. Более того, я не знаю точно количества элементов и позиций (сначала, последнего или среднего) в документе. Из-за динамического загружаемого контента будет отображаться на большой странице.
Ответы
Ответ 1
Следующая функция будет обрабатывать данные с частичной страницы просмотра загрузки и добавлять указанный контекст для каждого селектора jQuery в script. Этот ответ работает хорошо. Однако он не поддерживает внешний файл script.
function renderPartialView(control, data)
{
// For detecting all script tag in loaded data.
var reExtractScript = /(<script type="text\/javascript">)([\s\S]+?)(<\/script>)/gi;
// For detecting all "$" sign (must be jQuery object) in loaded data.
var reFindDollarSign = /\$\(([\S]+?)\)/gi;
// Find all matched string in loaded data.
var result = reExtractScript.exec(data);
var allScript = '';
if (result)
{
for (i = 0; i < result.length; i += 4)
{
// Remove current script from loaded script.
data = data.replace(result[i], '');
// Replace all "$" function by adding context parameter that is control.
allScript += result[i+2].replace(reFindDollarSign, '$($1, "' + control + '")');
}
}
// Load non-script html to control.
$(control).html(data);
// Evaluate all script that is found in loaded data.
eval(allScript);
}
// This script will partially download view page from server in the same domain
$(function()
{
$.get(getUrl('~/Profile/Section/ViewEducation'), null, function(data)
{
// When partial loading is complete, all loaded data will be sent to "renderPartialView" function
renderPartialView('#education-view', data);
});
});
Ответ 2
Как насчет $('div[id^=placeholder]:last')
?
Селекторы/attrubuteStartsWith
Ответ 3
Вы можете просто использовать $('.innerdiv:first')
, чтобы получить first один или $('.inner-div:last')
, чтобы получить last one. Или, если у вас есть кратность и вы хотите выбрать конкретный $('.inner-div:nth(x)')
, где x - индекс элемента.
Ответ 4
Хорошо, давайте поговорим о вашем примере HTML. Я добавил класс placeholder и добавил тире в id для удобства позже.
<div id="placeholder-1" class="placeholder">
Dynamic Content will be placed inside this.
<div class="inner-div">baz</div>
<div class="div1">zip</div>
<a href="#" class="action">action</a>
</div>
<div id="placeholder-2" class="placeholder">
Dynamic Content will be placed inside this.
<div class="inner-div">foo</div>
<div class="div1">bar</div>
<a href="#" class="action">action</a>
</div>
Теперь я могу привязать событие к каждой из этих ссылок с помощью $('.placeholder a.action').bind('click', ... );
. Если я хочу, чтобы это событие ко всем будущим фрагментам html, как это показано на странице, я делаю $('.placeholder a.action').live('click', ... );
Этот код присоединяет событие к этим ссылкам, а операторы var
могут захватывать идентификатор или внутренний текст <div>
s. Таким образом, вы не имеете встречных значений атрибута id, но вы можете перемещать действия внутри div
с помощью заполнителя классов.
$('.placeholder a.action').live('click', function(){
// get the id
var id = $(this).parents('div.placeholder').attr('id').split('-')[1];
// get the text inside the div with class inner-div
var inner_div = $(this).parents('div.placeholder').children('.inner-div').text();
// get the text inside the div with class div1
var div1 = $(this).parents('div.placeholder').children('.div1').text();
return false;
});