Я могу только сделать несколько предположений о том, что может не сработать с вашим исходным кодом. Во-первых, следующий код предполагает, что все теги <p>
имеют как минимум 2 дочерних элемента:
for (i = 0; i<phrases.length; i++) {
phrases[i].number = i;
phrases[i].childNodes[1].innerHTML = french[i];
*phrases[i].childNodes[1].onMouseDown = swapFE;*
}
Если какие-либо теги <p>
на вашей странице имеют менее 2 дочерних элементов, будет выдано сообщение об ошибке и выполнение скрипта будет остановлено. Лучшим решением для этого было бы добавить атрибут класса к каждому тегу <p>
, который будет содержать элементы, которые вы ищете. Кроме того, вы можете просто проверить наличие второго дочернего узла с помощью оператора if
. Или вы могли бы сделать оба.
Во-вторых, как и все события, onmousedown
должен быть объявлен в нижнем регистре. Установка onMouseDown
не выдаст ошибку, но вместо этого создаст пользовательское свойство для элемента вместо того, чтобы присоединять обработчик события.
Наконец, следующий код:
var swapFE = document.getElementsByTagName("phrase");
будет локально переопределять глобальную функцию swapFE
для этой функции, заменяя ее вместо переменной.
Вот как я мог бы написать вашу setupTranslation
функцию:
function setUpTranslation() {
var phrases = document.getElementsByTagName("p");
// rename the swapFE var as outlined below
var swapFENodes = document.getElementsByTagName("phrase");
var cNode; // set up an empty variable that we use inside the loop
for (i = 0; i<phrases.length; i++) {
/* Check for the existence of the translationPhrase class
in the <p> tag and the set the cNode var to childNodes[1]
and testing for its existence at the same time */
if (cNode.className != "translationPhrase"
|| !(cNode = phrases[i].childNodes[1]))
continue; // skip to the next iteration
phrases[i].number = i;
cNode.innerHTML = french[i];
cNode.onmousedown = swapFE; // Changed onMouseDown to onmousedown
}
}