Я полагаю, что современный подход должен использовать эти id
атрибут, который был бы оценен как привязка. Например, если бы Вы изменились
<h2><a name="one">Section One</a></h2>
к
<h2><a id="one">Section One</a></h2>
, то Вы все еще обратились бы к нему как page.html#one
.
Этот код работает. Отредактировано на основе ответа Ранделла.
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript">
$(document).ready(function()
{
setTimeout(function() { $('#some_id').load('index.php'); }, 10000);
});
</script>
Благодаря Ранделлу
PHP - это язык сценариев на стороне сервера. Если вам нужно проверить, что что-то уже загружено на стороне клиента, вам понадобится язык сценариев на стороне клиента, например JavaScript .
Возможно, вам понадобится использовать jQuery для ваших целей , чтобы упростить вещи.
jQuery - это быстрый и лаконичный JavaScript Библиотека, упрощающая HTML-документ обход, обработка событий, анимация, и Ajax-взаимодействия для быстрого развитие. jQuery предназначен для изменить способ написания JavaScript.
Сначала загрузите jQuery . В теге заголовка вашего HTML добавьте следующее:
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript">
// Check if the page has loaded completely
$(document).ready( function() {
setTimeout( function() {
$('#some_id').load('index.php');
}, 10000);
});
</script>
В теле вашего HTML добавьте следующее:
<div id="some_id"></div>
Не совсем, нет. 10 секунд после загрузки страницы - это (как минимум) 10 секунд после завершения вашего PHP-скрипта, то есть он больше не работает (кроме уловок, которые пытаются сохранить соединение открытым, что, я не думаю, сработает на время до 10 секунд)!
Следовательно, вам нужно либо запланировать выполнение задания cron
на стороне сервера, которое будет запускаться через 10 секунд, либо вам потребуется обратный вызов с веб-сайта, используя AJAX .
Это кажется странной идеей, но, возможно, это то, что вы ищете, если хотите сделать это на PHP, не касаясь HTML / JS:
<?php
your_website_here();
flush(); //this sends the output to the client. You may also need ob_flush();
sleep(10); //wait 10 seconds
your_func_here();
?>
Теоретически все вышесказанное нормально, но на практике это приведет к ОЧЕНЬ потребляемой памяти приложением. Так что будьте осторожны.
И, пожалуйста, не понижайте меня, это всего лишь теоретический спор.
if вы имеете в виду, что после загрузки страницы вам нужно будет использовать для этого javascript / ajax / jquery.
Если вам действительно нужно сделать это в одном и том же PHP-скрипте, самым чистым способом будет fork .
Или, если это невозможно, вот действительно плохой хакер способ сделать это:
<?php
ignore_user_abort(1);
page_output_stuff();
// ...
flush();
sleep(10);
do_something_after_script();
?>
Если вы делаете это для вывода данных пользователю после задержки, то выше можно заставить работать, но это действительно уродливый способ сделать это. Просто используйте вместо этого AJAX.
Вы можете создать таймер Javascript, который будет вызывать функцию каждые десять секунд.
(10 секунд - 10000 миллисекунд)
Вы не можете сделать это с помощью PHP, кроме, возможно, использования некоторый crontab / цикл с sleep () и file_get_contents (). Или используйте javascript / ajax, как упоминалось ранее.
Php - это язык сценариев обслуживания, который не может определить, загружена страница или нет. поэтому вам нужно использовать JavaScript на стороне клиента.
Самое близкое, что я могу придумать, это:
После того, как ваш скрипт завершит выполнение, он сохраняет запись в базе данных с указанием времени. Затем демон (стиль cron) каждую секунду выполняет каждую инструкцию в базах данных старше 10 секунд.
Благодаря Оливеру за то, что я начал, у меня теперь есть решение, которое поддерживает рефакторинг и является типобезопасным. Это также позволило мне реализовать INotifyPropertyChanged, чтобы он справлялся с переименовываемыми свойствами.
Его использование выглядит так:
checkBoxCanEdit.Bind(c => c.Checked, person, p => p.UserCanEdit);
textBoxName.BindEnabled(person, p => p.UserCanEdit);
checkBoxEmployed.BindEnabled(person, p => p.UserCanEdit);
trackBarAge.BindEnabled(person, p => p.UserCanEdit);
textBoxName.Bind(c => c.Text, person, d => d.Name);
checkBoxEmployed.Bind(c => c.Checked, person, d => d.Employed);
trackBarAge.Bind(c => c.Value, person, d => d.Age);
labelName.BindLabelText(person, p => p.Name);
labelEmployed.BindLabelText(person, p => p.Employed);
labelAge.BindLabelText(person, p => p.Age);
Класс person показывает, как реализовать INotifyPropertyChanged безопасным способом (или см. Этот ответ для другой довольно хороший способ реализации INotifyPropertyChanged, ActiveSharp - Automatic INotifyPropertyChanged также выглядит хорошо):
public class Person : INotifyPropertyChanged
{
private bool _employed;
public bool Employed
{
get { return _employed; }
set
{
_employed = value;
OnPropertyChanged(() => c.Employed);
}
}
// etc
private void OnPropertyChanged(Expression<Func<object>> property)
{
if (PropertyChanged != null)
{
PropertyChanged(this,
new PropertyChangedEventArgs(BindingHelper.Name(property)));
}
}
public event PropertyChangedEventHandler PropertyChanged;
}
Вспомогательный класс привязки WinForms имеет в себе основу, которая заставляет все работать:
namespace TypeSafeBinding
{
public static class BindingHelper
{
private static string GetMemberName(Expression expression)
{
// The nameof operator was implemented in C# 6.0 with .NET 4.6
// and VS2015 in July 2015.
// The following is still valid for C# < 6.0
switch (expression.NodeType)
{
case ExpressionType.MemberAccess:
var memberExpression = (MemberExpression) expression;
var supername = GetMemberName(memberExpression.Expression);
if (String.IsNullOrEmpty(supername)) return memberExpression.Member.Name;
return String.Concat(supername, '.', memberExpression.Member.Name);
case ExpressionType.Call:
var callExpression = (MethodCallExpression) expression;
return callExpression.Method.Name;
case ExpressionType.Convert:
var unaryExpression = (UnaryExpression) expression;
return GetMemberName(unaryExpression.Operand);
case ExpressionType.Parameter:
case ExpressionType.Constant: //Change
return String.Empty;
default:
throw new ArgumentException("The expression is not a member access or method call expression");
}
}
public static string Name<T, T2>(Expression<Func<T, T2>> expression)
{
return GetMemberName(expression.Body);
}
//NEW
public static string Name<T>(Expression<Func<T>> expression)
{
return GetMemberName(expression.Body);
}
public static void Bind<TC, TD, TP>(this TC control, Expression<Func<TC, TP>> controlProperty, TD dataSource, Expression<Func<TD, TP>> dataMember) where TC : Control
{
control.DataBindings.Add(Name(controlProperty), dataSource, Name(dataMember));
}
public static void BindLabelText<T>(this Label control, T dataObject, Expression<Func<T, object>> dataMember)
{
// as this is way one any type of property is ok
control.DataBindings.Add("Text", dataObject, Name(dataMember));
}
public static void BindEnabled<T>(this Control control, T dataObject, Expression<Func<T, bool>> dataMember)
{
control.Bind(c => c.Enabled, dataObject, dataMember);
}
}
}
Здесь используется много нового в C # 3.5 и показывает, что возможно. Если бы только у нас были гигиенические макросы программист на Lisp мог бы перестать называть нас гражданами второго сорта)
Вы можете использовать конструкцию declare вместе с register_tick_function , чтобы механизм PHP вызывал вашу функцию каждые x «тиков». Из руководства:
Галочка - это событие, которое происходит для каждые N низкоуровневых операторов выполняется парсером внутри объявить блок. Значение N равно указывается с помощью ticks = N внутри раздел директивы declare blocks.