Как я отслеживаю загрузки файла

Короткие и простые: поскольку элементы, которые вы ищете, не существуют в документе (пока).


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

Возможные причины

Есть две причины, по которым элемент может не существовать:

  1. Элемент с переданным идентификатором действительно не существует в документе. Вы должны дважды проверить, что идентификатор, который вы передаете на getElementById, действительно соответствует идентификатору существующего элемента в (сгенерированном) HTML и что у вас не было с ошибкой идентификатор (идентификаторы чувствительный !). Кстати, в большинстве современных браузеров , которые реализуют методы querySelector() и querySelectorAll(), нотация стиля CSS используется для извлечения элемента его id, например: document.querySelector('#elementID'), в отличие от способа, с помощью которого элемент извлекается его id в [[16]; в первом символе # необходимо, во втором это приведет к тому, что элемент не будет извлечен.
  2. Элемент не существует в данный момент , который вы вызываете getElementById ].

Последний случай довольно распространен. Браузеры анализируют и обрабатывают HTML сверху вниз. Это означает, что любой вызов элемента DOM, который встречается до появления этого элемента DOM в HTML, не будет выполнен.

Рассмотрим следующий пример:



Появляется div после script. В настоящий момент сценарий выполняется, элемент не существует , но и getElementById вернут null.

jQuery

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

Добавленный поворот - это когда jQuery не найден потому, что вы загрузили скрипт без протокола и запускаетесь из файловой системы:


этот синтаксис используется, чтобы позволить сценарию загружаться через HTTPS на странице с протоколом https: // и для загрузки HTTP-версии на странице с протоколом http: //

У этого есть неудачный побочный эффект попытки и невозможность загрузить file://somecdn.somewhere.com...


Решения

Прежде чем позвонить getElementById (или любой метод DOM, если на то пошло), убедитесь, что элементы, к которым вы хотите получить доступ, существуют, т. е. загружается DOM.

Это может быть обеспечено просто добавив ваш JavaScript после к соответствующему элементу DOM

, и в этом случае вы также можете поместить код непосредственно перед тегом закрывающего тела () (все DOM элементы будут доступны в момент выполнения скрипта). [/ g3 6]

Другие решения включают прослушивание событий load [MDN] или DOMContentLoaded [MDN] . В этих случаях не имеет значения, где в документе вы помещаете код JavaScript, вам просто нужно запомнить, чтобы весь обработчик DOM обрабатывался в обработчиках событий.

Пример:

window.onload = function() {
    // process DOM elements here
};

// or

// does not work IE 8 and below
document.addEventListener('DOMContentLoaded', function() {
    // process DOM elements here
});

Более подробную информацию об обработке событий и различиях браузера см. в статьях на странице quirksmode.org .

jQuery

Сначала убедитесь, что jQuery загружен правильно , Используйте инструменты разработчика браузера , чтобы узнать, был ли найден файл jQuery и исправлен ли URL-адрес, если он не был (например, добавьте схему http: или https: в начале, отрегулируйте путь, и т. д.)

Прослушивание событий load / DOMContentLoaded - это именно то, что делает jQuery с .ready() [docs] . Весь ваш код jQuery, который влияет на элемент DOM, должен находиться внутри этого обработчика событий.

На самом деле в учебнике j8uery явно указано:

Как почти все, что мы делаем при использовании jQuery, читает или манипулирует объектной моделью документа (DOM), мы должны убедиться, что мы начинаем добавлять события и т. д., как только DOM готов.

Для этого мы регистрируем готовое событие для документа.

$(document).ready(function() {
   // do stuff when DOM is ready
});
blockquote>

В качестве альтернативы вы также можете использовать сокращенный синтаксис:

$(function() {
    // do stuff when DOM is ready
});

Оба эквивалентны.

76
задан Rahul 4 June 2019 в 09:25
поделиться

7 ответов

Забавная вещь, я записал php медиа-галерею для всей своей музыки 2 дня назад. У меня была подобная проблема. Я использую http://musicplayer.sourceforge.net/ для плеера. И плей-лист создается через php. Весь музыкальный запрос идет туда сценарий, названный xfer.php? file=WHATEVER

$filename = base64_url_decode($_REQUEST['file']);
header("Cache-Control: public");
header('Content-disposition: attachment; filename='.basename($filename));
header("Content-Transfer-Encoding: binary");
header('Content-Length: '. filesize($filename));

//  Put either file counting code here. either a db or static files

//

readfile($filename);  //and spit the user the file


function base64_url_decode($input) {
    return base64_decode(strtr($input, '-_,', '+/='));
}

И когда Вы звоните, файлы используют что-то как:

function base64_url_encode($input) {
     return strtr(base64_encode($input), '+/=', '-_,');
}

http://us.php.net/manual/en/function.base64-encode.php

При использовании некоторого JavaScript или Flash player (плеер JW, например), который требует, чтобы фактическая ссылка была mp3 файлом, или что бы то ни было, можно добавить текст "&type=.mp3", таким образом, финал linke становится чем-то как: "www.example.com/xfer.php?file=34842ffjfjxfh&type=.mp3". Тем путем похоже, что это заканчивается mp3 расширением, не влияя на ссылку файла.

38
ответ дан Aeyoun 24 November 2019 в 11:19
поделиться

Используйте свои httpd файлы журнала. Установка http://awstats.sourceforge.net/

28
ответ дан Tim Boland 24 November 2019 в 11:19
поделиться

Если Ваша песня / двоичный файл подавался апачем, Вы можете легко grep access_log для обнаружения количества загрузок. Простой post-logrotate сценарий может grep журналы и поддерживать Вашу статистику количества в дб. Это имеет преимущество производительности, не находясь в Вашем живом пути выполнения кода запроса. Выполнение некритических вещей как статистика офлайн является хорошей идеей масштабировать Ваш веб-сайт к большому количеству пользователей.

13
ответ дан Vinay Y S 24 November 2019 в 11:19
поделиться

Вы могли даже настроить Apache .htaccess директива, которая преобразовывает запросы *.mp3 в querystring dubayou, работает с. Это мог бы быть изящный способ сохранить прямой запрос и все еще быть в состоянии к функции журнала воздушного потока в ответ.

12
ответ дан saint_groceon 24 November 2019 в 11:19
поделиться

Действительно ли ссылка игры является ссылкой на фактический mp3 файл или на некоторый код JavaScript, который открывается плеер?

, Если последний, можно легко добавить собственный код входа там для отслеживания количества хитов к нему.

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

6
ответ дан Dillie-O 24 November 2019 в 11:19
поделиться

Существует ли база данных для Вашей музыкальной библиотеки? Если существует какой-либо серверный код, который работает при загрузке mp3 тогда, можно добавить дополнительный код там для постепенного увеличения количества игры. У Вас мог также быть JavaScript, выполняют второй запрос для постепенного увеличения количества игры, но это могло привести к людям/роботам, ложно увеличивающим количества.

я раньше работал на радио-Интернетом сайт, и мы использовали отдельные таблицы для отслеживания времени, каждая песня игралась. Наши потоки приводились в действие сценарием жемчуга, работающим icecast, таким образом, мы инициировали запрос к базе данных каждый раз, когда новый трек начал играть. Затем для вычисления игры рассчитывают, мы выполнили бы запрос для подсчета, сколько раз идентификатор песни был в журнале игры.

3
ответ дан Mike H 24 November 2019 в 11:19
поделиться

Используйте bash:

grep mp3 /var/log/httpd/access_log | wc
25
ответ дан 24 November 2019 в 11:19
поделиться
Другие вопросы по тегам:

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