Я только что придумал довольно разумное решение, которое позволяет вам определять файлы для сборки и создавать каталоги автоматически. Сначала определите переменную ALL_TARGET_FILES
, которая содержит имя файла для каждого файла, который будет создан ваш make-файл. Затем используйте следующий код:
define depend_on_dir
$(1): | $(dir $(1))
ifndef $(dir $(1))_DIRECTORY_RULE_IS_DEFINED
$(dir $(1)):
mkdir -p $$@
$(dir $(1))_DIRECTORY_RULE_IS_DEFINED := 1
endif
endef
$(foreach file,$(ALL_TARGET_FILES),$(eval $(call depend_on_dir,$(file))))
Вот как это работает. Я определяю функцию depend_on_dir
, которая принимает имя файла и генерирует правило, которое заставляет файл зависеть от каталога, который его содержит, а затем определяет правило для создания этого каталога, если это необходимо. Затем я использую foreach
в call
эту функцию для каждого имени файла и eval
.
Обратите внимание, что вам понадобится версия GNU make, которая поддерживает eval
, что я думаю - версии 3.81 и выше.
Попробуйте это:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>iPad Experiment</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js" type="text/javascript"></script>
<script type="text/javascript">
$(document).ready(function() {
if(navigator.platform == "iPad") {
$("a").each(function() { // have to use an `each` here - either a jQuery `each` or a `for(...)` loop
var onClick; // this will be a function
var firstClick = function() {
onClick = secondClick;
return false;
};
var secondClick = function() {
onClick = firstClick;
return true;
};
onClick = firstClick;
$(this).click(function() {
return onClick();
});
});
}
});
</script>
<style type="text/css">
a:hover {
color:white;
background:#FF00FF;
}
</style>
<body>
<a href="http://google.ca">Google</a>
<a href="http://stackoverflow.com">stackoverflow.com</a>
</body>
</html>
... или посмотрите демонстрацию на моем веб-сайте . Обратите внимание, что он настроен только для того, чтобы творить чудеса на iPad. Обнаружение всех версий iOS - еще один вопрос в моих книгах;)
Он работает на основе того факта, что ...
После того, как вы щелкнете ссылку на iphone или ipad, на нем останется смоделированное наведение мыши, которое запускает стилизацию a: hover css для этой ссылки. Если ссылка имеет обработчик javascript, который удерживает вас на той же странице, состояние наведения не изменится, пока вы не нажмете другую ссылку.
Образец цитирования: Safari iphone / ipad «зависание мыши» на новой ссылке после замены предыдущей ссылки на javascript
Вот еще одна оптимизированная версия, которая также обрабатывает закрытие : hover
. Вам нужно будет инкапсулировать свой сайт с помощью
<div id="container"></div>
, чтобы он мог Работа. Просто положить закрывающее событие на тело ничего не сделало
var bodyBound = false;
var container;
if (navigator.userAgent.match(/iPhone/i) || navigator.userAgent.match(/iPod/i) || navigator.userAgent.match(/iPad/i))
{
container = $("#container");
// Provoke iOS :hover event
$("a.someLink").on("mouseover", handleHoverClick);
}
function handleClose(event)
{
container.off("click", handleClose);
bodyBound = false;
}
function handleHoverClick(event)
{
if (!bodyBound)
{
bodyBound = true;
// Somehow, just calling this function—even if empty—closes the :hover
container.on("click", handleClose);
}
}
Вот оптимизированная версия кода jQuery, предоставленного Ричардом Дж.П. Ле Гуэном:
$(document).ready(function() {
$('a').each(function() {
var clicked = false;
$(this).bind('click', function() {
if(!clicked) return !(clicked = true);
});
});
});
Существует более простой способ исправить проблему с iOS и состояниями наведения, используя CSS. Для ссылки у вас есть проблема с установленным свойством cursor
равным pointer
, и состояние наведения будет игнорироваться в iOS. Все ссылки для правильной работы см. Ниже:
a
{cursor: pointer;}