Активация нескольких уникальных всплывающих окон с помощью JQuery Dialog - PullRequest
1 голос
/ 30 марта 2012

Я новичок в Javascript и JQuery и пытаюсь добиться следующего:

В TinyMCE я хочу набрать следующее:

  • Нажмите здесь, чтобы посмотреть видео 1
  • [Всплывающее] путь / к / file1.mp4
  • Нажмите здесь, чтобы посмотреть видео 2
  • [Всплывающее] путь / к / file2.mp4

Затем JQuery будет использовать ловушку [popup] для определения случаев, когда я хочу диалоговое окно, поместить якорь для вызова этого диалога, заполнить диалог вызовом JWPlayer и передать ему путь, указанный в каждом экземпляре , Именно в сохранении каждого URL и последующем предоставлении этого точного URL игроку у меня возникают большие трудности.

Удалось добиться успеха в конце - без сомнения, существуют более элегантные решения. Спасибо Бену за то, что он привел меня с собой.

ОБНОВЛЕНО РАБОЧИМ РЕШЕНИЕМ : Текущий код:

$(document).ready(function(){

var num = 0;

//Find [popup] instances, increment the number
$("li:contains('[popup]')").each(function() {
    var nextnumber = num++;

    //add a general and a unique class to the list item containing the hook
    //this leaves only the path to file in that list item.
    $(this).addClass('popup' + ' ' + 'pop' + nextnumber);

    //Split on the hook, and save remainder of text (the path to file) as the 'path' attr
    var splitpath = $(this).text().split("[popup]");
    $(this).attr("path", splitpath[1]); 
    var path = $(this).attr("path");
    //alert($(this).attr("path"));

    //Get the previous list item (the call to action), and give it general and unique classes also.
    $thisArrow = $(this).parent().prev();
    $thisArrow.addClass('arrow' + ' ' + 'arr' + nextnumber);

    //Make the call to action an anchor link, with a general class identifier.
    $thisArrow.wrapInner('<a class="opener" title="Click to view video" path ="' + path + '"/>');

    //store path to poster as var, and hide the .popup li's
    $('li.popup').parent().hide();
});

$('.opener').click(function() {
    var Header = $(this).text();
    var popupURL = $(this).attr("path");
    var popupBG = "../contents/css/images/white-nontrans.jpg";

var thisDialog = $('<div></div>')

   //N.B. THE FOLLOWING HTML SHOULD BE ENTIRELY INCLUDED IN THE SINGLE .HTML() CALL
   //Otherwise Jquery will automatically close the <object> after the first line

   .html('<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" id="mediaplayer1" name="mediaplayer1" width="550" height="420">')
.append('<param name="movie" value="../mediaplayer/player.swf">')    
.append('<param name="allowfullscreen" value="true">')
.append('<param name="allowscriptaccess" value="always">')
.append('<param name="bgcolor" value="#FFFFFF">')
.append('<param name="wmode" value="opaque">') 
.append('<param name="flashvars" value="file=' + popupURL + '&image=' + popupBG + '">') 
.append('<embed id="mediaplayer1" name="mediaplayer2" src="../mediaplayer/player.swf" width="550" height="420" allowfullscreen="true" allowscriptaccess="always" bgcolor="#FFFFFF" wmode="opaque" flashvars="file=' + popupURL + '&image=' + popupBG + '" />')
.append('</object>')

.dialog({ autoOpen: false, title: Header, modal: true, width:570 });
thisDialog.dialog('open');
    return false;
});
});

1 Ответ

1 голос
/ 30 марта 2012

Относительно просто. В функции, которая преобразует ваши ловушки [popup], определите var counter = 0 перед циклом .each. Внутри цикла выполните итерацию счетчика и используйте это число для генерации уникальных данных / разметок, которые вы применяете из цикла.

Это довольно краткое описание решения. Если вам нужно больше деталей, просто дайте мне знать.

edit: Кажется, проблема не в самом хранилище, а в идентификации и получении контроля над URL. Вы должны иметь возможность хранить URL в произвольно названном атрибуте в теге привязки. Это будет технически «незаконный» тег, поэтому он ничего не будет делать, но он будет там, он не будет ничего мешать, и вы сможете легко вытащить его с помощью функции jquery .attr() .

Получение самого URL-адреса, чтобы вы могли поместить его в выбранный вами атрибут, вероятно, лучше всего сделать с помощью javascript split(). Сначала разделим на «[popup]». Это даст вам массив, где первый элемент начинается в начале текстового блока, а каждый последующий элемент начинается сразу после «[popup]». Затем разделите каждый из них (кроме первого) на ''. Это даст вам массив этого элемента, разделенный пробелами - это означает, что первым элементом в массиве (как вы мне его описали) должен быть искомый URL.

edit2:

$("li:contains('[popup]')").each(function() {
    var text = $(this).text();
    //by my understanding of split(), the [0] element in the array would be the
    //bit before the "[popup]" string, so we want the [1] element. 
    var splittext = text.split("[popup]")[1];
    var splitsplittext = splittext.split[" "];
    //by my understanding of the way you've presented the use rules, the [0]
    //element of splitsplittext ought to contain your path now.  If you want
    //to make it more robust (say, allowing the user to put an optional space
    //between the "[popup]" and the path) then the logic here gets more
    //complicated.
    $(this).attr("pathHolder", splitsplittext[0]); 
}

Как только вы это сделаете, в любое время, когда у вас есть <li>, вы можете позвонить $liNode.attr("pathholder"), чтобы получить адресную строку

edit3: несколько мыслей ... - Вы устанавливаете несколько классов, добавляя пробелы вручную. Мое понимание хорошей практики кодирования подсказывает, что вы должны просто вызывать addClass несколько раз. - Вы делаете много вещей с селекторами, что вы должны делать с переменными. Например, вы используете $('li.pop'+nextnumber), когда можете просто продолжать использовать $(this). Вы добавляете класс к стрелке, чтобы вы могли использовать $('li.arr'+nextnumber), когда вы могли просто сказать что-то вроде $thisArrow = $(this).prev(), а затем использовали $thisArrow, когда вам нужно было сослаться на вещь. - когда вы определяете диалог, вам не нужно использовать var $dialog = - вам нужно всего лишь var или $. var означает, что это переменная javascript, что означает, что она строго ограничена. $ означает, что это объект JQuery, что означает, что он по существу ограничен областью страницы. К сожалению, ни то, ни другое не поможет вам, поскольку ваш код написан. Версия javascript уничтожит себя почти сразу, так как вы можете перейти к концу функции, а версия JQuery перезапишет себя в следующем цикле каждого цикла. Для того, чтобы сохранить его должным образом, вам придется где-то записать его. Кроме того, я уверен, что JQuery посмотрит на $('<div></div>') и просто запутается. Похоже, он пытается быть селектором и терпит неудачу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...