Как связать условие Javascript c PHP
Есть база в ней находятся url. Мне надо проверить урл на ошибку, если она есть то удалить из БД. В JavaScript не селен, как связать JavaScript и PHP? Или как можно написать цикл и запросы на удаление из БД в JS
query("SELECT * FROM `table 1`"); while ($pos_result=$pos->fetch_assoc()): < $url = $pos_result['url']; $name = $pos_result['name']; ?> endwhile; ?>
Отслеживать
задан 20 мар 2020 в 9:39
Dima Buljgo Dima Buljgo
1 3 3 бронзовых знака
Где этот код должен выполняться? На сервере?
20 мар 2020 в 10:09
В javascript провести проверку и если ошибка есть — отправить name при помощи ajax (без перезагрузки страницы) в php. А там, если name получен — провести удаление из базы.
20 мар 2020 в 10:10
Да он должен выполняться на сервере
20 мар 2020 в 10:12
Тогда зачем js? Прекрасно справится php
20 мар 2020 в 10:13
у меня проверка на CORS, проблемы возникают при JS, а с помощью php я не найду ошибку
20 мар 2020 в 10:14
0
Сортировка: Сброс на вариант по умолчанию
Знаете кого-то, кто может ответить? Поделитесь ссылкой на этот вопрос по почте, через Твиттер или Facebook.
- javascript
- php
- mysql
Внешние скрипты, порядок исполнения
Материал на этой странице устарел, поэтому скрыт из оглавления сайта.
Более новая информация по этой теме находится на странице https://learn.javascript.ru/script-async-defer.
Если JavaScript-кода много – его выносят в отдельный файл, который подключается в HTML:
Здесь /path/to/script.js – это абсолютный путь к файлу, содержащему скрипт (из корня сайта).
Браузер сам скачает скрипт и выполнит.
Можно указать и полный URL, например:
Вы также можете использовать путь относительно текущей страницы. Например, src=»https://learn.javascript.ru/lodash.js» обозначает файл из текущей директории.
Чтобы подключить несколько скриптов, используйте несколько тегов:
На заметку:
Как правило, в HTML пишут только самые простые скрипты, а сложные выносят в отдельный файл.
Браузер скачает его только первый раз и в дальнейшем, при правильной настройке сервера, будет брать из своего кеша.
Благодаря этому один и тот же большой скрипт, содержащий, к примеру, библиотеку функций, может использоваться на разных страницах без полной перезагрузки с сервера.
Если указан атрибут src , то содержимое тега игнорируется.
В одном теге SCRIPT нельзя одновременно подключить внешний скрипт и указать код.
Вот так не сработает:
Нужно выбрать: либо SCRIPT идёт с src , либо содержит код. Тег выше следует разбить на два: один – с src , другой – с кодом, вот так:
Асинхронные скрипты: defer/async
Браузер загружает и отображает HTML постепенно. Особенно это заметно при медленном интернет-соединении: браузер не ждёт, пока страница загрузится целиком, а показывает ту часть, которую успел загрузить.
Если браузер видит тег , то он по стандарту обязан сначала выполнить его, а потом показать оставшуюся часть страницы.
Например, в примере ниже – пока все кролики не будут посчитаны – нижний
не будет показан:
Начинаем считать:
Кролики посчитаны!
Такое поведение называют «синхронным». Как правило, оно вполне нормально, но есть важное следствие.
Если скрипт – внешний, то пока браузер не выполнит его, он не покажет часть страницы под ним.
То есть, в таком документе, пока не загрузится и не выполнится big.js , содержимое будет скрыто:
Этот текст не будет показан, пока браузер не выполнит big.js.
И здесь вопрос – действительно ли мы этого хотим? То есть, действительно ли оставшуюся часть страницы нельзя показывать до загрузки скрипта?
Есть ситуации, когда мы не только НЕ хотим такой задержки, но она даже опасна.
Например, если мы подключаем внешний скрипт, который показывает рекламу или вставляет счётчик посещений, а затем идёт наша страница. Конечно, неправильно, что пока счётчик или реклама не подгрузятся – оставшаяся часть страницы не показывается. Счётчик посещений не должен никак задерживать отображение страницы сайта. Реклама тоже не должна тормозить сайт и нарушать его функциональность.
А что, если сервер, с которого загружается внешний скрипт, перегружен? Посетитель в этом случае может ждать очень долго!
Вот пример, с подобным скриптом (стоит искусственная задержка загрузки):
Важная информация не покажется, пока не загрузится скрипт.
. Важная информация!
Можно поставить все подобные скрипты в конец страницы – это уменьшит проблему, но не избавит от неё полностью, если скриптов несколько. Допустим, в конце страницы 3 скрипта, и первый из них тормозит – получается, другие два его будут ждать – тоже нехорошо.
Кроме того, браузер дойдёт до скриптов, расположенных в конце страницы, они начнут грузиться только тогда, когда вся страница загрузится. А это не всегда правильно. Например, счётчик посещений наиболее точно сработает, если загрузить его пораньше.
Поэтому «расположить скрипты внизу» – не лучший выход.
Кардинально решить эту проблему помогут атрибуты async или defer :
Поддерживается всеми браузерами, кроме IE9-. Скрипт выполняется полностью асинхронно. То есть, при обнаружении браузер не останавливает обработку страницы, а спокойно работает дальше. Когда скрипт будет загружен – он выполнится.
Поддерживается всеми браузерами, включая самые старые IE. Скрипт также выполняется асинхронно, не заставляет ждать страницу, но есть два отличия от async .
Первое – браузер гарантирует, что относительный порядок скриптов с defer будет сохранён.
То есть, в таком коде (с async ) первым сработает тот скрипт, который раньше загрузится:
А в таком коде (с defer ) первым сработает всегда 1.js , а скрипт 2.js , даже если загрузился раньше, будет его ждать.
Поэтому атрибут defer используют в тех случаях, когда второй скрипт 2.js зависит от первого 1.js , к примеру – использует что-то, описанное первым скриптом.
Второе отличие – скрипт с defer сработает, когда весь HTML-документ будет обработан браузером.
Например, если документ достаточно большой…
Много много много букв
…То скрипт async.js выполнится, как только загрузится – возможно, до того, как весь документ готов. А defer.js подождёт готовности всего документа.
Это бывает удобно, когда мы в скрипте хотим работать с документом, и должны быть уверены, что он полностью получен.
async вместе с defer
При одновременном указании async и defer в современных браузерах будет использован только async , в IE9- – только defer (не понимает async ).
Атрибуты async/defer – только для внешних скриптов
Атрибуты async/defer работают только в том случае, если назначены на внешние скрипты, т.е. имеющие src .
При попытке назначить их на обычные скрипты , они будут проигнорированы.
Тот же пример с async :
Важная информация теперь не ждёт, пока загрузится скрипт.
. Важная информация!
При запуске вы увидите, что вся страница отобразилась тут же, а alert из внешнего скрипта появится позже, когда загрузится скрипт.
Эти атрибуты давно «в ходу»
Большинство современных систем рекламы и счётчиков знают про эти атрибуты и используют их.
Перед вставкой внешнего тега понимающий программист всегда проверит, есть ли у него подобный атрибут. Иначе медленный скрипт может задержать загрузку страницы.
Забегая вперёд
Для продвинутого читателя, который знает, что теги можно добавлять на страницу в любой момент при помощи самого javascript, заметим, что скрипты, добавленные таким образом, ведут себя так же, как async . То есть, выполняются как только загрузятся, без сохранения относительного порядка.
Если же нужно сохранить порядок выполнения, то есть добавить несколько скриптов, которые выполнятся строго один за другим, то используется свойство script.async = false .
Выглядит это примерно так:
function addScript(src) < var script = document.createElement('script'); script.src = src; script.async = false; // чтобы гарантировать порядок document.head.appendChild(script); >addScript('1.js'); // загружаться эти скрипты начнут сразу addScript('2.js'); // выполнятся, как только загрузятся addScript('3.js'); // но, гарантированно, в порядке 1 -> 2 -> 3
Более подробно работу со страницей мы разберём во второй части учебника.
Итого
- Скрипты вставляются на страницу как текст в теге , либо как внешний файл через
- Специальные атрибуты async и defer используются для того, чтобы пока грузится внешний скрипт – браузер показал остальную (следующую за ним) часть страницы. Без них этого не происходит.
- Разница между async и defer : атрибут defer сохраняет относительную последовательность скриптов, а async – нет. Кроме того, defer всегда ждёт, пока весь HTML-документ будет готов, а async – нет.
Очень важно не только читать учебник, но делать что-то самостоятельно.
Решите задачки, чтобы удостовериться, что вы всё правильно поняли.
Задачи
Какой скрипт выполнится первым?
важность: 4
В примере ниже подключены два скрипта small.js и big.js .
Если предположить, что small.js загружается гораздо быстрее, чем big.js – какой выполнится первым?
Unity C# JavaScript
У меня есть скрипт (CScript), написанный на C# и прикреплённый к определённому объекту (Object1), и есть ещё один скрипт, написанный на JavaScript(JScript) и прикреплённый к другому объекту (Object2).
И мне нужно из CScript изменить публичную переменную(Variable1), находящуюся в JScript. При этом эти два скрипта расположены в разных папках (Если это вообще важно) .
Как это сделать?
Просьба писать только дельные ответы и не оффтопить.
#1
17:38, 15 мая 2014
Гуглить на офф сайте не пробовал? Вот например:
http://answers.unity3d.com/questions/184738/javascript-call-a-method-from-c-sharp-and-vise-ver.html
- Kano_Tanaka
- Пользователь
#2
18:53, 15 мая 2014
Executor
> http://answers.unity3d.com/questions/184738/javascript-call-a-method-from-c-sharp-and-vise-ver.html
Нет, это не то. В данном скрипте я просто обращаюсь к другому, взяв его как класс, который я добавляю в свой скрипт. А мне надо изменить переменную, находящуюся в другом скрипте из своего.
#3
21:10, 15 мая 2014
Kano_Tanaka
> Нет, это не то. В данном скрипте я просто обращаюсь к другому, взяв его как
> класс, который я добавляю в свой скрипт. А мне надо изменить переменную,
> находящуюся в другом скрипте из своего.
А Вы понимаете, что «другой» скрипт — это тоже класс? А как обратиться к переменной класса имея экземпляр этого класса знаете? А Вы поняли зачем Вам дали вторую ссылку?
- Kano_Tanaka
- Пользователь
#4
21:37, 15 мая 2014
seaman
> А Вы понимаете, что «другой» скрипт — это тоже класс?
Ну, как бы каждый скрипт как бы начинается с объявления класса, охватывающего весь скрипт(объявление библиотек не в счёт), разве это не делает его собственно классом?
seaman
> А как обратиться к переменной класса имея экземпляр этого класса знаете?
Этого не знаю, но здесь чисто по логике не подходит метод из первой ссылке, ведь там берётся скрипт из папки, а не тот, что привязан к объекту. Такой скрипт может быть привязан к сотне различных объектов, а мне нужно, чтобы переменная менялась только на одном, конкретном.
seaman
> А Вы поняли зачем Вам дали вторую ссылку?
Там что-то про порядок выполнения скриптов, но я без понятия, при чём это здесь.
А вообще, я умею обращаться нужным мне образом к скриптам, которые тоже написаны на C#, однако такой фокус с JavaScript не прокатывает.
public GameObject Object1; public Script2 Name1; Name1 = Object1.GetComponent ();
#5
22:19, 15 мая 2014
Сталкивался с тем что из ява не видел публичные поля С#, или наоборот, не помню. Разбираться не стал, а просто переписал все на C# и проблема ушла.
#6
1:53, 16 мая 2014
1. Простой ― не забивать себе голову и использовать в проекте один язык.
2. Непростой ― разобраться, в каком порядке компилируются папки со скриптами, какие в результате получаются сборки (assemblies) и какие между этими сборками возникают зависимости.
Для каждого используемого языка Unity может сгенерировать по 4 отдельные сборки.
1) Скрипты на C# из папок Plugins/Editor или Standard Assets/Editor попадают в сборку Assembly-CSharp-Editor-firstpass.dll
2) Скрипты на C# из папок Plugins или Standard Assets попадают в сборку Assembly-CSharp-firstpass.dll
3) Скрипты на C# из папок Editor попадают в сборку Assembly-CSharp-Editor.dll
4) Скрипты на C# из любых других папок попадают в сборку Assembly-CSharp.dll
Для других языков аналогично, только названия файлов будут другие.
А вот картинка зависимостей между сборками (по доброй традиции существование Boo игнорируем):

Из этой картинки видно, что если у нас есть два скрипта, один на C#, второй на UnityScript, и они не лежат в папках с зарезервированными именами, то их код попадёт в независимые друг от друга сборки. Т.е. эти скрипты никак не смогут ссылаться друг на друга.
Чтобы скрипт на C# мог обращаться к данными или вызывать методы скрипта на UnityScript, последний должен лежать в папке с названием Plugins или Standard Assets. Тогда компилятор сгенерирует сборки Assembly-CSharp.dll и Assembly-UnityScript-firstpass.dll, где первая будет зависеть от второй. А иначе у нас бы были сборки Assembly-CSharp.dll и Assembly-UnityScript.dll, независимые друг от друга.
Ещё нужно отметить, что поскольку в .Net запрещены циклические зависимости между сборками, то невозможно сделать так, чтобы два скрипта на разных языках могли обращаться друг к другу равноправно. Если сборка А зависит от сборки Б, то код из сборки А может обращаться к коду из сборки Б, но наоборот уже не получится.
- Dan Diamond
- Постоялец
Выполнение javascript в программе на C#

На днях просматривал популярные библиотеки на codeplex и увидел там пару библиотек для работы с javascript. Сразу вспомнился случай, когда мне нужно было написать небольшую программку для взаимодействия с личным кабинетом на одном сайте. Поэтому без раздумий решил попробовать, как бы они справились с той задачей.
Под катом я расскажу о нерядовом взаимодействии с сайтом, каким образом я решил задачу на тот момент и смогли ли обе библиотеки справиться с той же задачей. Сразу скажу, что речь пойдёт о следующих библиотеках: jint и javascriptdotnet.
Ссылку на сайт, а также примеры javascript функций, которые я использовал, при тестировании я давать не буду, чтобы читатели не ставили эксперименты над данным ресурсом, речь будет вестись в общих чертах.
Начну с небольшой истории как начиналась разработка, я зашёл на сайт, перешёл в кабинет, после чего загрузил fiddler и начал смотреть и записывать какие параметры куда передаются, с помощью каких методов и по каким ссылкам. Довольно быстро я набросал себе алгоритм и принялся реализовывать, но столкнулся с проблемой, оказалось, что один из параметров, который я принял за случайное число не являлся таковым, чуть позже выяснилось, что вызов функции random() на самом видном месте служил лишь для отвлечения внимания, что же на самом деле там происходит помогло мне установить дополнение для Firefox под названием javascript deobfuscator, для тех, кто не знаком с данным или похожими дополнениями, то выглядит оно, таким образом, при открытии на странице google.com:

В моём случае было несколько проще, т.к. никаких фоновых скриптов не выполнялось, а чётко было видно, какие скрипты выполнялись при том или ином действии. Вот тогда я и узнал, что для получения моего «случайного» числа должно выполниться больше 200 строк кода или немногим больше 15 функций. Первым о чём я подумал, что сейчас быстренько переведу данный код на C# и на этом закончу, но проблема была в том, что знания javascript у меня поверхностные, а весь код пропущен через обфускатор и по коду видно, что там какие-то криптографические преобразования происходят, поэтому я решил, что проще будет данный код выполнить в исходном виде.
Для того, чтобы проверить, действительно ли выполняется мой код, я сразу выбрал самый простой способ — это с помощью компонента webBrowser, пример из Msdn:
* This source code was highlighted with Source Code Highlighter .
После чего достаточно вызвать следующий код:
webBrowser1.Document.InvokeScript( «test» , new String [] < "called from client code" >);
Но данный пример подходит лишь для теста, т.к. компонент webBrowser я категорически не хотел использовать в своей программе, поэтому я принялся искать другие способы решения и нашёл следующий пример:
Шаги для создания .dll:
1. Создать файл в блокноте, только с этой строкой:
class EvalClass < function Evaluate(expression: String) < return eval(expression); >>
2. Сохранить файл как C:\MyEval.js
3. Открыть VS Command Prompt (Start, Programs, VS, VS Tools)
4. Написать Cd\ чтобы оказаться в корне C:\
5. Написать
jsc /t:library C:\MyEval.js
6. После чего появиться новый файл MyEval.dll.
7. Скопировать MyEval.dll в проект и добавить ссылку на него (также нужно сослаться на Microsoft.Jscript.dll).
8. После чего можно обращаться к библиотеке таким образом:
EvalClass jScriptEvaluator = new EvalClass();
object objResult = jScriptEvaluator.Evaluate(“1==1 && 2==2”);
В моём случае я сделал всё абсолютно так, как описано выше с той лишь разницей, что в классе у меня было гораздо больше функций, собственно на тот момент данного кода мне хватило.
Библиотека jint
Лицензия: The MIT License (MIT)
Первым делом я решил попробовать примеры, все они заработали, но как я заметил, что на codeplex тоже есть проблемы с парсером, который «съел» в некоторых местах скобки, немного поправив примеры, все они заработали. Дальше я принялся пробовать его работу на своём наборе функций, но к сожалению так и не смог заставить библиотеку вернуть мне искомое значение, гуглил, читал обсуждения. пробовал что-то менять, но к сожалению не смог побороть String.fromCharCode():
Jint.JintException: Method isn’t defined: fromCharCode
Библиотека подключается стандартно, добавить ссылки и написать:
using Jint;
После чего достаточно такого кода, чтобы вызвать функцию:
StreamReader sr = new StreamReader( @»C:\habr_javascript\MyEval.js» );
string script = sr.ReadToEnd();
JintEngine engine = new JintEngine();
engine.Run(script);
object num = engine.Run( «Evaluate(42210607);» );
MessageBox.Show(num.ToString());
* This source code was highlighted with Source Code Highlighter .
Библиотека javascriptdotnet
Лицензия: New BSD License (BSD)
Запустив один пример, следом я сразу начал пробовать свой тестовый пример и бинго, всё заработало с первого раза.
Указываем ссылку на библиотеку, добавляем директиву using:
using Noesis.Javascript;
И пишем код, который практически идентичен предыдущему:
StreamReader sr = new StreamReader( @»C:\habr_javascript\MyEval.js» );
string script = sr.ReadToEnd();
JavascriptContext context = new JavascriptContext();
context.Run(script);
object num = context.Run( «Evaluate(42210607);» );
MessageBox.Show(num.ToString());
* This source code was highlighted with Source Code Highlighter .
Вывод
Не хотелось бы говорить что-то плохое в адрес jint, т.к. скорее всего я просто не разобрался и она работает не хуже javascriptdotnet. Хоть моя программа уже работает больше 6 месяцев, но мне сразу хотелось упростить возможные правки, т.к. в случае, если разработчики сайта поменяют буквально один символ, то мне придётся пересобрать библиотеку, а в случае jint и javascriptdotnet достаточно лишь отредактировать файл ресурсов. Также сложно себе представить, как можно добавлять функции во время выполнения программы. Более активно развивается библиотека jint и последний релиз был совсем недавно 14 февраля 2011 года, когда javascriptdotnet обновилась 16 сентября 2010 года. Библиотеки могут быть использованы не только для указанного в статье способа, но также и для тестирования Вашего сайта, на том же stackoverflow видел, что разработчики использовали jint для тестирования серверного javascript, собственно там же больше упоминают о jint. В общем, надеюсь, что данная статья была Вам полезна и в случае необходимости взаимодействия C# с javascript она будет Вам полезна.