Расширение ответа salathe для этого дополнительного требования:
Теперь, что происходит, когда я добавляю элементы в массив, а не в сортировку? Меня не волнует, какой порядок они появляются, если он приходит после тех, которые я указал.
blockquote>Вам нужно добавить два дополнительных условия в функцию сортировки:
- Элемент «dont care» должен считаться больше, чем «заботиться» о предметах
- . Два элемента «dont care» должны считаться равными
Поэтому пересмотренный код будет:
$order = array( 3452342, 5867867, 7867867, 1231233 ); $array = array( array("id" => 7867867, "title" => "Must Be #3"), array("id" => 3452342, "title" => "Must Be #1"), array("id" => 1231233, "title" => "Must Be #4"), array("id" => 5867867, "title" => "Must Be #2"), array("id" => 1111111, "title" => "Dont Care #1"), array("id" => 2222222, "title" => "Dont Care #2"), array("id" => 3333333, "title" => "Dont Care #3"), array("id" => 4444444, "title" => "Dont Care #4") ); function custom_compare($a, $b){ global $order; $a = array_search($a["id"], $order); $b = array_search($b["id"], $order); if($a === false && $b === false) { // both items are dont cares return 0; // a == b } else if ($a === false) { // $a is a dont care item return 1; // $a > $b } else if ($b === false) { // $b is a dont care item return -1; // $a < $b } else { return $a - $b; } } shuffle($array); // for testing var_dump($array); // before usort($array, "custom_compare"); var_dump($array); // after
Выход:
Before | After -------------------------------+------------------------------- array(8) { | array(8) { [0]=> | [0]=> array(2) { | array(2) { ["id"]=> | ["id"]=> int(4444444) | int(3452342) ["title"]=> | ["title"]=> string(12) "Dont Care #4" | string(10) "Must Be #1" } | } [1]=> | [1]=> array(2) { | array(2) { ["id"]=> | ["id"]=> int(3333333) | int(5867867) ["title"]=> | ["title"]=> string(12) "Dont Care #3" | string(10) "Must Be #2" } | } [2]=> | [2]=> array(2) { | array(2) { ["id"]=> | ["id"]=> int(1231233) | int(7867867) ["title"]=> | ["title"]=> string(10) "Must Be #4" | string(10) "Must Be #3" } | } [3]=> | [3]=> array(2) { | array(2) { ["id"]=> | ["id"]=> int(1111111) | int(1231233) ["title"]=> | ["title"]=> string(12) "Dont Care #1" | string(10) "Must Be #4" } | } [4]=> | [4]=> array(2) { | array(2) { ["id"]=> | ["id"]=> int(5867867) | int(2222222) ["title"]=> | ["title"]=> string(10) "Must Be #2" | string(12) "Dont Care #2" } | } [5]=> | [5]=> array(2) { | array(2) { ["id"]=> | ["id"]=> int(2222222) | int(1111111) ["title"]=> | ["title"]=> string(12) "Dont Care #2" | string(12) "Dont Care #1" } | } [6]=> | [6]=> array(2) { | array(2) { ["id"]=> | ["id"]=> int(3452342) | int(3333333) ["title"]=> | ["title"]=> string(10) "Must Be #1" | string(12) "Dont Care #3" } | } [7]=> | [7]=> array(2) { | array(2) { ["id"]=> | ["id"]=> int(7867867) | int(4444444) ["title"]=> | ["title"]=> string(10) "Must Be #3" | string(12) "Dont Care #4" } | } } | }
Стандарт CustomValidator имеет свойство ClientValidationFunction для этого:
<asp:CustomValidator ControlToValidate="Text1"
ClientValidationFunction="onValidate" />
<script type='text/javascript'>
function onValidate(validatorSpan, eventArgs)
{ eventArgs.IsValid = (eventArgs.Value.length > 0);
if (!eventArgs.IsValid) highlight(validatorSpan);
}
</script>
Да я сделал так. Я использовал Firebug для обнаружения Точки. Сетевые функции JS и затем угнанный функции блока проверки допустимости
следующее будет применено ко всем блокам проверки допустимости и является чисто стороной клиента. Я использую его для изменения способа, которым проверка ASP.NET отображена, не способ, которым на самом деле выполняется проверка. Это должно быть перенесено в $ (документ) .ready (), чтобы гарантировать, что это перезаписывает исходную проверку ASP.net.
/**
* Re-assigns a couple of the ASP.NET validation JS functions to
* provide a more flexible approach
*/
function UpgradeASPNETValidation(){
// Hi-jack the ASP.NET error display only if required
if (typeof(Page_ClientValidate) != "undefined") {
ValidatorUpdateDisplay = NicerValidatorUpdateDisplay;
AspPage_ClientValidate = Page_ClientValidate;
Page_ClientValidate = NicerPage_ClientValidate;
}
}
/**
* Extends the classic ASP.NET validation to add a class to the parent span when invalid
*/
function NicerValidatorUpdateDisplay(val){
if (val.isvalid){
// do custom removing
$(val).fadeOut('slow');
} else {
// do custom show
$(val).fadeIn('slow');
}
}
/**
* Extends classic ASP.NET validation to include parent element styling
*/
function NicerPage_ClientValidate(validationGroup){
var valid = AspPage_ClientValidate(validationGroup);
if (!valid){
// do custom styling etc
// I added a background colour to the parent object
$(this).parent().addClass('invalidField');
}
}
То, что можно сделать, сцепиться в блок проверки допустимости и присвоиться, новое оценивают метод, как это:
<script type="text/javascript">
rfv.evaluationfunction = validator;
function validator(sender, e) {
alert('rawr');
}
</script>
rfv является идентификатором моего блока проверки допустимости обязательного поля. Необходимо сделать это у основания страницы так, чтобы она присвоила его после того, как JavaScript для блока проверки допустимости регистрируется.
Его намного более легкое только, чтобы использовать CustomFieldValidator и присвоить его клиентское свойство проверки.
<asp:CustomValidator ControlToValidate="txtBox" ClientValidationFunction="onValidate" />
<script type='text/javascript'>
function onValidate(sender, e)
{
alert('do validation');
}
</script>